blob: 88ef25a1abcd31a91c0f46319749804539207e0b [file] [log] [blame]
Vipin Mehta30295c82010-09-01 12:06:33 -07001//------------------------------------------------------------------------------
2// <copyright file="ar6k.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// AR6K device layer that handles register level I/O
22//
23// Author(s): ="Atheros"
24//==============================================================================
25#ifndef AR6K_H_
26#define AR6K_H_
27
28#include "hci_transport_api.h"
29#include "../htc_debug.h"
30
31#define AR6K_MAILBOXES 4
32
33/* HTC runs over mailbox 0 */
34#define HTC_MAILBOX 0
35
36#define AR6K_TARGET_DEBUG_INTR_MASK 0x01
37
38#define OTHER_INTS_ENABLED (INT_STATUS_ENABLE_ERROR_MASK | \
39 INT_STATUS_ENABLE_CPU_MASK | \
40 INT_STATUS_ENABLE_COUNTER_MASK)
41
42
43//#define MBOXHW_UNIT_TEST 1
44
45#include "athstartpack.h"
Luis R. Rodrigueze6998a52011-03-10 18:55:41 -080046PREPACK struct ar6k_irq_proc_registers {
Joe Perchesab3655d2011-02-02 14:05:49 -080047 u8 host_int_status;
48 u8 cpu_int_status;
49 u8 error_int_status;
50 u8 counter_int_status;
51 u8 mbox_frame;
52 u8 rx_lookahead_valid;
53 u8 host_int_status2;
54 u8 gmbox_rx_avail;
Joe Perchese1ce2a32011-02-02 14:05:51 -080055 u32 rx_lookahead[2];
56 u32 rx_gmbox_lookahead_alias[2];
Luis R. Rodrigueze6998a52011-03-10 18:55:41 -080057} POSTPACK;
Vipin Mehta30295c82010-09-01 12:06:33 -070058
Luis R. Rodrigueze6998a52011-03-10 18:55:41 -080059#define AR6K_IRQ_PROC_REGS_SIZE sizeof(struct ar6k_irq_proc_registers)
Vipin Mehta30295c82010-09-01 12:06:33 -070060
Luis R. Rodriguezdfaa26b2011-03-10 18:55:40 -080061PREPACK struct ar6k_irq_enable_registers {
Joe Perchesab3655d2011-02-02 14:05:49 -080062 u8 int_status_enable;
63 u8 cpu_int_status_enable;
64 u8 error_status_enable;
65 u8 counter_int_status_enable;
Luis R. Rodriguezdfaa26b2011-03-10 18:55:40 -080066} POSTPACK;
Vipin Mehta30295c82010-09-01 12:06:33 -070067
Luis R. Rodriguez89c625b2011-03-10 18:55:37 -080068PREPACK struct ar6k_gmbox_ctrl_registers {
Joe Perchesab3655d2011-02-02 14:05:49 -080069 u8 int_status_enable;
Luis R. Rodriguez89c625b2011-03-10 18:55:37 -080070} POSTPACK;
Vipin Mehta30295c82010-09-01 12:06:33 -070071
72#include "athendpack.h"
73
Luis R. Rodriguezdfaa26b2011-03-10 18:55:40 -080074#define AR6K_IRQ_ENABLE_REGS_SIZE sizeof(struct ar6k_irq_enable_registers)
Vipin Mehta30295c82010-09-01 12:06:33 -070075
76#define AR6K_REG_IO_BUFFER_SIZE 32
77#define AR6K_MAX_REG_IO_BUFFERS 8
Joe Perches1071a132011-02-02 14:05:47 -080078#define FROM_DMA_BUFFER true
79#define TO_DMA_BUFFER false
Vipin Mehta30295c82010-09-01 12:06:33 -070080#define AR6K_SCATTER_ENTRIES_PER_REQ 16
81#define AR6K_MAX_TRANSFER_SIZE_PER_SCATTER 16*1024
82#define AR6K_SCATTER_REQS 4
83#define AR6K_LEGACY_MAX_WRITE_LENGTH 2048
84
85#ifndef A_CACHE_LINE_PAD
86#define A_CACHE_LINE_PAD 128
87#endif
88#define AR6K_MIN_SCATTER_ENTRIES_PER_REQ 2
89#define AR6K_MIN_TRANSFER_SIZE_PER_SCATTER 4*1024
90
91/* buffers for ASYNC I/O */
Luis R. Rodriguez26da4b52011-03-10 18:55:35 -080092struct ar6k_async_reg_io_buffer {
Vipin Mehta30295c82010-09-01 12:06:33 -070093 HTC_PACKET HtcPacket; /* we use an HTC packet as a wrapper for our async register-based I/O */
Joe Perchesab3655d2011-02-02 14:05:49 -080094 u8 _Pad1[A_CACHE_LINE_PAD];
95 u8 Buffer[AR6K_REG_IO_BUFFER_SIZE]; /* cache-line safe with pads around */
96 u8 _Pad2[A_CACHE_LINE_PAD];
Luis R. Rodriguez26da4b52011-03-10 18:55:35 -080097};
Vipin Mehta30295c82010-09-01 12:06:33 -070098
Luis R. Rodriguez69c44f42011-03-10 18:55:38 -080099struct ar6k_gmbox_info {
Vipin Mehta30295c82010-09-01 12:06:33 -0700100 void *pProtocolContext;
Joe Perchesab3655d2011-02-02 14:05:49 -0800101 int (*pMessagePendingCallBack)(void *pContext, u8 LookAheadBytes[], int ValidBytes);
Joe Perches1071a132011-02-02 14:05:47 -0800102 int (*pCreditsPendingCallback)(void *pContext, int NumCredits, bool CreditIRQEnabled);
Joe Perches1f4c34b2011-01-27 20:04:19 -0800103 void (*pTargetFailureCallback)(void *pContext, int Status);
Vipin Mehta30295c82010-09-01 12:06:33 -0700104 void (*pStateDumpCallback)(void *pContext);
Joe Perches1071a132011-02-02 14:05:47 -0800105 bool CreditCountIRQEnabled;
Luis R. Rodriguez69c44f42011-03-10 18:55:38 -0800106};
Vipin Mehta30295c82010-09-01 12:06:33 -0700107
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800108struct ar6k_device {
Vipin Mehta30295c82010-09-01 12:06:33 -0700109 A_MUTEX_T Lock;
Joe Perchesab3655d2011-02-02 14:05:49 -0800110 u8 _Pad1[A_CACHE_LINE_PAD];
Luis R. Rodrigueze6998a52011-03-10 18:55:41 -0800111 struct ar6k_irq_proc_registers IrqProcRegisters; /* cache-line safe with pads around */
Joe Perchesab3655d2011-02-02 14:05:49 -0800112 u8 _Pad2[A_CACHE_LINE_PAD];
Luis R. Rodriguezdfaa26b2011-03-10 18:55:40 -0800113 struct ar6k_irq_enable_registers IrqEnableRegisters; /* cache-line safe with pads around */
Joe Perchesab3655d2011-02-02 14:05:49 -0800114 u8 _Pad3[A_CACHE_LINE_PAD];
Vipin Mehta30295c82010-09-01 12:06:33 -0700115 void *HIFDevice;
Joe Perchese1ce2a32011-02-02 14:05:51 -0800116 u32 BlockSize;
117 u32 BlockMask;
Vipin Mehta30295c82010-09-01 12:06:33 -0700118 HIF_DEVICE_MBOX_INFO MailBoxInfo;
119 HIF_PENDING_EVENTS_FUNC GetPendingEventsFunc;
120 void *HTCContext;
121 HTC_PACKET_QUEUE RegisterIOList;
Luis R. Rodriguez26da4b52011-03-10 18:55:35 -0800122 struct ar6k_async_reg_io_buffer RegIOBuffers[AR6K_MAX_REG_IO_BUFFERS];
Vipin Mehta30295c82010-09-01 12:06:33 -0700123 void (*TargetFailureCallback)(void *Context);
Joe Perches1f4c34b2011-01-27 20:04:19 -0800124 int (*MessagePendingCallback)(void *Context,
Joe Perchese1ce2a32011-02-02 14:05:51 -0800125 u32 LookAheads[],
Vipin Mehta30295c82010-09-01 12:06:33 -0700126 int NumLookAheads,
Joe Perches1071a132011-02-02 14:05:47 -0800127 bool *pAsyncProc,
Vipin Mehta30295c82010-09-01 12:06:33 -0700128 int *pNumPktsFetched);
129 HIF_DEVICE_IRQ_PROCESSING_MODE HifIRQProcessingMode;
130 HIF_MASK_UNMASK_RECV_EVENT HifMaskUmaskRecvEvent;
Joe Perches1071a132011-02-02 14:05:47 -0800131 bool HifAttached;
Vipin Mehta30295c82010-09-01 12:06:33 -0700132 HIF_DEVICE_IRQ_YIELD_PARAMS HifIRQYieldParams;
Joe Perches1071a132011-02-02 14:05:47 -0800133 bool DSRCanYield;
Vipin Mehta30295c82010-09-01 12:06:33 -0700134 int CurrentDSRRecvCount;
135 HIF_DEVICE_SCATTER_SUPPORT_INFO HifScatterInfo;
Luis R. Rodriguez01eb1da2011-03-14 10:58:35 -0700136 struct dl_list ScatterReqHead;
Joe Perches1071a132011-02-02 14:05:47 -0800137 bool ScatterIsVirtual;
Vipin Mehta30295c82010-09-01 12:06:33 -0700138 int MaxRecvBundleSize;
139 int MaxSendBundleSize;
Luis R. Rodriguez69c44f42011-03-10 18:55:38 -0800140 struct ar6k_gmbox_info GMboxInfo;
Joe Perches1071a132011-02-02 14:05:47 -0800141 bool GMboxEnabled;
Luis R. Rodriguez89c625b2011-03-10 18:55:37 -0800142 struct ar6k_gmbox_ctrl_registers GMboxControlRegisters;
Vipin Mehta30295c82010-09-01 12:06:33 -0700143 int RecheckIRQStatusCnt;
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800144};
Vipin Mehta30295c82010-09-01 12:06:33 -0700145
146#define LOCK_AR6K(p) A_MUTEX_LOCK(&(p)->Lock);
147#define UNLOCK_AR6K(p) A_MUTEX_UNLOCK(&(p)->Lock);
148#define REF_IRQ_STATUS_RECHECK(p) (p)->RecheckIRQStatusCnt = 1 /* note: no need to lock this, it only gets set */
149
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800150int DevSetup(struct ar6k_device *pDev);
151void DevCleanup(struct ar6k_device *pDev);
152int DevUnmaskInterrupts(struct ar6k_device *pDev);
153int DevMaskInterrupts(struct ar6k_device *pDev);
154int DevPollMboxMsgRecv(struct ar6k_device *pDev,
Joe Perchese1ce2a32011-02-02 14:05:51 -0800155 u32 *pLookAhead,
Vipin Mehta30295c82010-09-01 12:06:33 -0700156 int TimeoutMS);
Joe Perches1f4c34b2011-01-27 20:04:19 -0800157int DevRWCompletionHandler(void *context, int status);
158int DevDsrHandler(void *context);
159int DevCheckPendingRecvMsgsAsync(void *context);
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800160void DevAsyncIrqProcessComplete(struct ar6k_device *pDev);
161void DevDumpRegisters(struct ar6k_device *pDev,
Luis R. Rodrigueze6998a52011-03-10 18:55:41 -0800162 struct ar6k_irq_proc_registers *pIrqProcRegs,
Luis R. Rodriguezdfaa26b2011-03-10 18:55:40 -0800163 struct ar6k_irq_enable_registers *pIrqEnableRegs);
Vipin Mehta30295c82010-09-01 12:06:33 -0700164
Joe Perches1071a132011-02-02 14:05:47 -0800165#define DEV_STOP_RECV_ASYNC true
166#define DEV_STOP_RECV_SYNC false
167#define DEV_ENABLE_RECV_ASYNC true
168#define DEV_ENABLE_RECV_SYNC false
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800169int DevStopRecv(struct ar6k_device *pDev, bool ASyncMode);
170int DevEnableRecv(struct ar6k_device *pDev, bool ASyncMode);
171int DevEnableInterrupts(struct ar6k_device *pDev);
172int DevDisableInterrupts(struct ar6k_device *pDev);
173int DevWaitForPendingRecv(struct ar6k_device *pDev,u32 TimeoutInMs,bool *pbIsRecvPending);
Vipin Mehta30295c82010-09-01 12:06:33 -0700174
175#define DEV_CALC_RECV_PADDED_LEN(pDev, length) (((length) + (pDev)->BlockMask) & (~((pDev)->BlockMask)))
176#define DEV_CALC_SEND_PADDED_LEN(pDev, length) DEV_CALC_RECV_PADDED_LEN(pDev,length)
177#define DEV_IS_LEN_BLOCK_ALIGNED(pDev, length) (((length) % (pDev)->BlockSize) == 0)
178
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800179static INLINE int DevSendPacket(struct ar6k_device *pDev, HTC_PACKET *pPacket, u32 SendLength) {
Joe Perchese1ce2a32011-02-02 14:05:51 -0800180 u32 paddedLength;
Joe Perches1071a132011-02-02 14:05:47 -0800181 bool sync = (pPacket->Completion == NULL) ? true : false;
Joe Perches1f4c34b2011-01-27 20:04:19 -0800182 int status;
Vipin Mehta30295c82010-09-01 12:06:33 -0700183
184 /* adjust the length to be a multiple of block size if appropriate */
185 paddedLength = DEV_CALC_SEND_PADDED_LEN(pDev, SendLength);
186
187#if 0
188 if (paddedLength > pPacket->BufferLength) {
Joe Perches1071a132011-02-02 14:05:47 -0800189 A_ASSERT(false);
Vipin Mehta30295c82010-09-01 12:06:33 -0700190 if (pPacket->Completion != NULL) {
191 COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
Joe Perches4f69cef2011-02-02 14:05:57 -0800192 return 0;
Vipin Mehta30295c82010-09-01 12:06:33 -0700193 }
194 return A_EINVAL;
195 }
196#endif
197
198 AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
199 ("DevSendPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
200 paddedLength,
201 pDev->MailBoxInfo.MboxAddresses[HTC_MAILBOX],
202 sync ? "SYNC" : "ASYNC"));
203
204 status = HIFReadWrite(pDev->HIFDevice,
205 pDev->MailBoxInfo.MboxAddresses[HTC_MAILBOX],
206 pPacket->pBuffer,
207 paddedLength, /* the padded length */
208 sync ? HIF_WR_SYNC_BLOCK_INC : HIF_WR_ASYNC_BLOCK_INC,
209 sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
210
211 if (sync) {
212 pPacket->Status = status;
213 } else {
214 if (status == A_PENDING) {
Joe Perches4f69cef2011-02-02 14:05:57 -0800215 status = 0;
Vipin Mehta30295c82010-09-01 12:06:33 -0700216 }
217 }
218
219 return status;
220}
221
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800222static INLINE int DevRecvPacket(struct ar6k_device *pDev, HTC_PACKET *pPacket, u32 RecvLength) {
Joe Perchese1ce2a32011-02-02 14:05:51 -0800223 u32 paddedLength;
Joe Perches1f4c34b2011-01-27 20:04:19 -0800224 int status;
Joe Perches1071a132011-02-02 14:05:47 -0800225 bool sync = (pPacket->Completion == NULL) ? true : false;
Vipin Mehta30295c82010-09-01 12:06:33 -0700226
227 /* adjust the length to be a multiple of block size if appropriate */
228 paddedLength = DEV_CALC_RECV_PADDED_LEN(pDev, RecvLength);
229
230 if (paddedLength > pPacket->BufferLength) {
Joe Perches1071a132011-02-02 14:05:47 -0800231 A_ASSERT(false);
Vipin Mehta30295c82010-09-01 12:06:33 -0700232 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
233 ("DevRecvPacket, Not enough space for padlen:%d recvlen:%d bufferlen:%d \n",
234 paddedLength,RecvLength,pPacket->BufferLength));
235 if (pPacket->Completion != NULL) {
236 COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
Joe Perches4f69cef2011-02-02 14:05:57 -0800237 return 0;
Vipin Mehta30295c82010-09-01 12:06:33 -0700238 }
239 return A_EINVAL;
240 }
241
242 AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
243 ("DevRecvPacket (0x%lX : hdr:0x%X) Padded Length: %d Mbox:0x%X (mode:%s)\n",
244 (unsigned long)pPacket, pPacket->PktInfo.AsRx.ExpectedHdr,
245 paddedLength,
246 pDev->MailBoxInfo.MboxAddresses[HTC_MAILBOX],
247 sync ? "SYNC" : "ASYNC"));
248
249 status = HIFReadWrite(pDev->HIFDevice,
250 pDev->MailBoxInfo.MboxAddresses[HTC_MAILBOX],
251 pPacket->pBuffer,
252 paddedLength,
253 sync ? HIF_RD_SYNC_BLOCK_FIX : HIF_RD_ASYNC_BLOCK_FIX,
254 sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
255
256 if (sync) {
257 pPacket->Status = status;
258 }
259
260 return status;
261}
262
263#define DEV_CHECK_RECV_YIELD(pDev) \
264 ((pDev)->CurrentDSRRecvCount >= (pDev)->HifIRQYieldParams.RecvPacketYieldCount)
265
266#define IS_DEV_IRQ_PROC_SYNC_MODE(pDev) (HIF_DEVICE_IRQ_SYNC_ONLY == (pDev)->HifIRQProcessingMode)
267#define IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(pDev) ((pDev)->HifIRQProcessingMode != HIF_DEVICE_IRQ_SYNC_ONLY)
268
269/**************************************************/
270/****** Scatter Function and Definitions
271 *
272 *
273 */
274
Joe Perches1071a132011-02-02 14:05:47 -0800275int DevCopyScatterListToFromDMABuffer(HIF_SCATTER_REQ *pReq, bool FromDMA);
Vipin Mehta30295c82010-09-01 12:06:33 -0700276
277 /* copy any READ data back into scatter list */
Joe Perches509c9d92011-01-27 20:04:20 -0800278#define DEV_FINISH_SCATTER_OPERATION(pR) \
279do { \
280 if (!((pR)->CompletionStatus) && \
281 !((pR)->Request & HIF_WRITE) && \
282 ((pR)->ScatterMethod == HIF_SCATTER_DMA_BOUNCE)) { \
283 (pR)->CompletionStatus = \
284 DevCopyScatterListToFromDMABuffer((pR), \
285 FROM_DMA_BUFFER); \
286 } \
287} while (0)
Vipin Mehta30295c82010-09-01 12:06:33 -0700288
289 /* copy any WRITE data to bounce buffer */
Joe Perches1f4c34b2011-01-27 20:04:19 -0800290static INLINE int DEV_PREPARE_SCATTER_OPERATION(HIF_SCATTER_REQ *pReq) {
Vipin Mehta30295c82010-09-01 12:06:33 -0700291 if ((pReq->Request & HIF_WRITE) && (pReq->ScatterMethod == HIF_SCATTER_DMA_BOUNCE)) {
292 return DevCopyScatterListToFromDMABuffer(pReq,TO_DMA_BUFFER);
293 } else {
Joe Perches4f69cef2011-02-02 14:05:57 -0800294 return 0;
Vipin Mehta30295c82010-09-01 12:06:33 -0700295 }
296}
297
298
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800299int DevSetupMsgBundling(struct ar6k_device *pDev, int MaxMsgsPerTransfer);
Vipin Mehta774c1fe2011-02-18 13:13:09 -0800300
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800301int DevCleanupMsgBundling(struct ar6k_device *pDev);
Vipin Mehta30295c82010-09-01 12:06:33 -0700302
303#define DEV_GET_MAX_MSG_PER_BUNDLE(pDev) (pDev)->HifScatterInfo.MaxScatterEntries
304#define DEV_GET_MAX_BUNDLE_LENGTH(pDev) (pDev)->HifScatterInfo.MaxTransferSizePerScatterReq
305#define DEV_ALLOC_SCATTER_REQ(pDev) \
306 (pDev)->HifScatterInfo.pAllocateReqFunc((pDev)->ScatterIsVirtual ? (pDev) : (pDev)->HIFDevice)
307
308#define DEV_FREE_SCATTER_REQ(pDev,pR) \
309 (pDev)->HifScatterInfo.pFreeReqFunc((pDev)->ScatterIsVirtual ? (pDev) : (pDev)->HIFDevice,(pR))
310
311#define DEV_GET_MAX_BUNDLE_RECV_LENGTH(pDev) (pDev)->MaxRecvBundleSize
312#define DEV_GET_MAX_BUNDLE_SEND_LENGTH(pDev) (pDev)->MaxSendBundleSize
313
Joe Perches1071a132011-02-02 14:05:47 -0800314#define DEV_SCATTER_READ true
315#define DEV_SCATTER_WRITE false
316#define DEV_SCATTER_ASYNC true
317#define DEV_SCATTER_SYNC false
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800318int DevSubmitScatterRequest(struct ar6k_device *pDev, HIF_SCATTER_REQ *pScatterReq, bool Read, bool Async);
Vipin Mehta30295c82010-09-01 12:06:33 -0700319
320#ifdef MBOXHW_UNIT_TEST
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800321int DoMboxHWTest(struct ar6k_device *pDev);
Vipin Mehta30295c82010-09-01 12:06:33 -0700322#endif
323
324 /* completely virtual */
Luis R. Rodriguez9107a262011-03-10 18:55:47 -0800325struct dev_scatter_dma_virtual_info {
Joe Perchesab3655d2011-02-02 14:05:49 -0800326 u8 *pVirtDmaBuffer; /* dma-able buffer - CPU accessible address */
327 u8 DataArea[1]; /* start of data area */
Luis R. Rodriguez9107a262011-03-10 18:55:47 -0800328};
Vipin Mehta30295c82010-09-01 12:06:33 -0700329
330
331
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800332void DumpAR6KDevState(struct ar6k_device *pDev);
Vipin Mehta30295c82010-09-01 12:06:33 -0700333
334/**************************************************/
335/****** GMBOX functions and definitions
336 *
337 *
338 */
339
340#ifdef ATH_AR6K_ENABLE_GMBOX
341
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800342void DevCleanupGMbox(struct ar6k_device *pDev);
343int DevSetupGMbox(struct ar6k_device *pDev);
344int DevCheckGMboxInterrupts(struct ar6k_device *pDev);
345void DevNotifyGMboxTargetFailure(struct ar6k_device *pDev);
Vipin Mehta30295c82010-09-01 12:06:33 -0700346
347#else
348
349 /* compiled out */
350#define DevCleanupGMbox(p)
Joe Perches4f69cef2011-02-02 14:05:57 -0800351#define DevCheckGMboxInterrupts(p) 0
Vipin Mehta30295c82010-09-01 12:06:33 -0700352#define DevNotifyGMboxTargetFailure(p)
353
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800354static INLINE int DevSetupGMbox(struct ar6k_device *pDev) {
Joe Perches1071a132011-02-02 14:05:47 -0800355 pDev->GMboxEnabled = false;
Joe Perches4f69cef2011-02-02 14:05:57 -0800356 return 0;
Vipin Mehta30295c82010-09-01 12:06:33 -0700357}
358
359#endif
360
361#ifdef ATH_AR6K_ENABLE_GMBOX
362
363 /* GMBOX protocol modules must expose each of these internal APIs */
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800364HCI_TRANSPORT_HANDLE GMboxAttachProtocol(struct ar6k_device *pDev, HCI_TRANSPORT_CONFIG_INFO *pInfo);
365int GMboxProtocolInstall(struct ar6k_device *pDev);
366void GMboxProtocolUninstall(struct ar6k_device *pDev);
Vipin Mehta30295c82010-09-01 12:06:33 -0700367
368 /* API used by GMBOX protocol modules */
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800369struct ar6k_device *HTCGetAR6KDevice(void *HTCHandle);
Vipin Mehta30295c82010-09-01 12:06:33 -0700370#define DEV_GMBOX_SET_PROTOCOL(pDev,recv_callback,credits_pending,failure,statedump,context) \
371{ \
372 (pDev)->GMboxInfo.pProtocolContext = (context); \
373 (pDev)->GMboxInfo.pMessagePendingCallBack = (recv_callback); \
374 (pDev)->GMboxInfo.pCreditsPendingCallback = (credits_pending); \
375 (pDev)->GMboxInfo.pTargetFailureCallback = (failure); \
376 (pDev)->GMboxInfo.pStateDumpCallback = (statedump); \
377}
378
379#define DEV_GMBOX_GET_PROTOCOL(pDev) (pDev)->GMboxInfo.pProtocolContext
380
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800381int DevGMboxWrite(struct ar6k_device *pDev, HTC_PACKET *pPacket, u32 WriteLength);
382int DevGMboxRead(struct ar6k_device *pDev, HTC_PACKET *pPacket, u32 ReadLength);
Vipin Mehta30295c82010-09-01 12:06:33 -0700383
Joe Perches1071a132011-02-02 14:05:47 -0800384#define PROC_IO_ASYNC true
385#define PROC_IO_SYNC false
Vipin Mehta30295c82010-09-01 12:06:33 -0700386typedef enum GMBOX_IRQ_ACTION_TYPE {
387 GMBOX_ACTION_NONE = 0,
388 GMBOX_DISABLE_ALL,
389 GMBOX_ERRORS_IRQ_ENABLE,
390 GMBOX_RECV_IRQ_ENABLE,
391 GMBOX_RECV_IRQ_DISABLE,
392 GMBOX_CREDIT_IRQ_ENABLE,
393 GMBOX_CREDIT_IRQ_DISABLE,
394} GMBOX_IRQ_ACTION_TYPE;
395
Luis R. Rodriguez495abc72011-03-10 18:55:36 -0800396int DevGMboxIRQAction(struct ar6k_device *pDev, GMBOX_IRQ_ACTION_TYPE, bool AsyncMode);
397int DevGMboxReadCreditCounter(struct ar6k_device *pDev, bool AsyncMode, int *pCredits);
398int DevGMboxReadCreditSize(struct ar6k_device *pDev, int *pCreditSize);
399int DevGMboxRecvLookAheadPeek(struct ar6k_device *pDev, u8 *pLookAheadBuffer, int *pLookAheadBytes);
400int DevGMboxSetTargetInterrupt(struct ar6k_device *pDev, int SignalNumber, int AckTimeoutMS);
Vipin Mehta30295c82010-09-01 12:06:33 -0700401
402#endif
403
404#endif /*AR6K_H_*/