1 /*
2  * Copyright (c) 2012, 2014-2016, 2018 The Linux Foundation. All rights reserved.
3  *
4  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5  *
6  *
7  * Permission to use, copy, modify, and/or distribute this software for
8  * any purpose with or without fee is hereby granted, provided that the
9  * above copyright notice and this permission notice appear in all
10  * copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19  * PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 /*
23  * This file was originally distributed by Qualcomm Atheros, Inc.
24  * under proprietary terms before Copyright ownership was assigned
25  * to the Linux Foundation.
26  */
27 
28 #ifndef __HTC_H__
29 #define __HTC_H__
30 
31 #ifndef ATH_TARGET
32 #include "athstartpack.h"
33 #endif
34 #ifdef ATHR_WIN_NWF
35 #pragma warning( disable:4214 ) //bit field types other than int
36 #endif
37 #undef MS
38 #define MS(_v, _f) (((_v) & _f##_MASK) >> _f##_LSB)
39 #undef SM
40 #define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
41 #undef WO
42 #define WO(_f)      ((_f##_OFFSET) >> 2)
43 
44 #undef GET_FIELD
45 #define GET_FIELD(_addr, _f) MS(*((A_UINT32 *)(_addr) + WO(_f)), _f)
46 #undef SET_FIELD
47 #define SET_FIELD(_addr, _f, _val)  \
48     (*((A_UINT32 *)(_addr) + WO(_f)) = \
49      (*((A_UINT32 *)(_addr) + WO(_f)) & ~_f##_MASK) | SM(_val, _f))
50 
51 #define HTC_GET_FIELD(_msg_buf, _msg_type, _f) \
52     GET_FIELD(_msg_buf, _msg_type ## _ ## _f)
53 
54 #define HTC_SET_FIELD(_msg_buf, _msg_type, _f, _val) \
55     SET_FIELD(_msg_buf, _msg_type ## _ ## _f, _val)
56 
57 #define HTC_WRITE32(_addr, _val) \
58     (*(A_UINT32 *)(_addr) = (_val))
59 
60 #ifndef A_OFFSETOF
61 #define A_OFFSETOF(type,field) (unsigned long)(&(((type *)NULL)->field))
62 #endif
63 
64 #define ASSEMBLE_UNALIGNED_UINT16(p,highbyte,lowbyte) \
65         (((A_UINT16)(((A_UINT8 *)(p))[(highbyte)])) << 8 | (A_UINT16)(((A_UINT8 *)(p))[(lowbyte)]))
66 
67 /****** DANGER DANGER ***************
68  *
69  *   The frame header length and message formats defined herein were
70  *   selected to accommodate optimal alignment for target processing.  This reduces code
71  *   size and improves performance.
72  *
73  *   Any changes to the header length may alter the alignment and cause exceptions
74  *   on the target. When adding to the message structures insure that fields are
75  *   properly aligned.
76  *
77  */
78 
79 /* HTC frame header */
80 typedef PREPACK struct _HTC_FRAME_HDR{
81         /* do not remove or re-arrange these fields, these are minimally required
82          * to take advantage of 4-byte lookaheads in some hardware implementations */
83     A_UINT32   EndpointID : 8,
84                Flags : 8,
85                PayloadLen : 16; /* length of data (including trailer) that follows the header */
86 
87     /***** end of 4-byte lookahead ****/
88 
89     A_UINT32   ControlBytes0 : 8, /* used for CRC check if CRC_CHECK flag set */
90                ControlBytes1 : 8, /* used for seq check if SEQ_CHECK flag set */
91                reserved : 16; /* used by bundle processing in SDIO systems */
92 
93     /* message payload starts after the header */
94 
95 } POSTPACK HTC_FRAME_HDR;
96 
97 #define HTC_FRAME_HDR_ENDPOINTID_LSB                0
98 #define HTC_FRAME_HDR_ENDPOINTID_MASK               0x000000ff
99 #define HTC_FRAME_HDR_ENDPOINTID_OFFSET             0x00000000
100 #define HTC_FRAME_HDR_FLAGS_LSB                     8
101 #define HTC_FRAME_HDR_FLAGS_MASK                    0x0000ff00
102 #define HTC_FRAME_HDR_FLAGS_OFFSET                  0x00000000
103 #define HTC_FRAME_HDR_PAYLOADLEN_LSB                16
104 #define HTC_FRAME_HDR_PAYLOADLEN_MASK               0xffff0000
105 #define HTC_FRAME_HDR_PAYLOADLEN_OFFSET             0x00000000
106 #define HTC_FRAME_HDR_CONTROLBYTES0_LSB             0
107 #define HTC_FRAME_HDR_CONTROLBYTES0_MASK            0x000000ff
108 #define HTC_FRAME_HDR_CONTROLBYTES0_OFFSET          0x00000004
109 #define HTC_FRAME_HDR_CONTROLBYTES1_LSB             8
110 #define HTC_FRAME_HDR_CONTROLBYTES1_MASK            0x0000ff00
111 #define HTC_FRAME_HDR_CONTROLBYTES1_OFFSET          0x00000004
112 #define HTC_FRAME_HDR_RESERVED_LSB                  16
113 #define HTC_FRAME_HDR_RESERVED_MASK                 0xffff0000
114 #define HTC_FRAME_HDR_RESERVED_OFFSET               0x00000004
115 
116 /* frame header flags */
117 
118     /* send direction */
119 #define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0)
120 #define HTC_FLAGS_SEND_BUNDLE        (1 << 1) /* start or part of bundle */
121 #define HTC_FLAGS_SEQ_CHECK          (1 << 2) /* seq check on rx side */
122 #define HTC_FLAGS_CRC_CHECK          (1 << 3) /* CRC check on rx side */
123 /* HTC_FLAGS_PADDING_CHECK
124  * Set by the sender to inform the receiver that the HTC packet begins
125  * with continuation (block) alignment padding from the prior HTC packet.
126  */
127 #define HTC_FLAGS_PADDING_CHECK      (1 << 4)
128     /* receive direction */
129 #define HTC_FLAGS_RECV_1MORE_BLOCK   (1 << 0) /* bit 0 bundle trailer present */
130 #define HTC_FLAGS_RECV_TRAILER       (1 << 1) /* bit 1 trailer data present */
131 #define HTC_FLAGS_RECV_BUNDLE_CNT_MASK   (0xFC)    /* bits 7..2  */
132 #define HTC_FLAGS_RECV_BUNDLE_CNT_SHIFT  2
133 /*
134  * To be compatible with an older definition of a smaller (4-bit)
135  * bundle count field, the bundle count is stored in a segmented
136  * format - the 4 LSbs of the bundle count value are stored in bits 5:2
137  * of the BUNDLE_CNT field, which is bits 7:4 of the HTC_FLAGS word;
138  * the next 2 bits of the bundle count value are stored in bits 1:0 of
139  * the BUNDLE_CNT field, which is bits 3:2 of the HTC_FLAGS word.
140  */
141 #define HTC_FLAGS_RECV_BUNDLE_CNT_SET(x)  \
142   ((((x) << 2) | ((x) >> 4)) << HTC_FLAGS_RECV_BUNDLE_CNT_SHIFT)
143 #define HTC_FLAGS_RECV_BUNDLE_CNT_GET(x)  \
144   ((((x) & HTC_FLAGS_RECV_BUNDLE_CNT_MASK) >> (HTC_FLAGS_RECV_BUNDLE_CNT_SHIFT + 2)) | \
145   ((((x) >> HTC_FLAGS_RECV_BUNDLE_CNT_SHIFT) & 0x3) << 4))
146 
147 #define HTC_HDR_LENGTH  (sizeof(HTC_FRAME_HDR))
148 #define HTC_HDR_ALIGNMENT_PADDING           \
149     (((sizeof(HTC_FRAME_HDR) + 3) & (~0x3)) - sizeof(HTC_FRAME_HDR))
150 #define HTC_MAX_TRAILER_LENGTH   255
151 #define HTC_MAX_PAYLOAD_LENGTH   (4096 - sizeof(HTC_FRAME_HDR))
152 
153 /* HTC control message IDs */
154 
155 #define HTC_MSG_READY_ID                    1
156 #define HTC_MSG_CONNECT_SERVICE_ID          2
157 #define HTC_MSG_CONNECT_SERVICE_RESPONSE_ID 3
158 #define HTC_MSG_SETUP_COMPLETE_ID           4
159 #define HTC_MSG_SETUP_COMPLETE_EX_ID        5
160 #define HTC_MSG_SEND_SUSPEND_COMPLETE       6
161 #define HTC_MSG_NACK_SUSPEND                7
162 #define HTC_MSG_WAKEUP_FROM_SUSPEND_ID      8
163 
164 #define HTC_MAX_CONTROL_MESSAGE_LENGTH  256
165 
166 /* base message ID header */
167 typedef PREPACK struct {
168     A_UINT32 MessageID: 16,
169              MetaData:   8,
170              reserved:   8;
171 } POSTPACK HTC_UNKNOWN_MSG;
172 
173 #define HTC_UNKNOWN_MSG_MESSAGEID_LSB                 0
174 #define HTC_UNKNOWN_MSG_MESSAGEID_MASK                0x0000ffff
175 #define HTC_UNKNOWN_MSG_MESSAGEID_OFFSET              0x00000000
176 #define HTC_UNKNOWN_MSG_METADATA_LSB                  16
177 #define HTC_UNKNOWN_MSG_METADATA_MASK                 0X00ff0000
178 #define HTC_UNKNOWN_MSG_METADATA_OFFSET               0x00000000
179 
180 /* HTC ready message
181  * direction : target-to-host  */
182 typedef PREPACK struct {
183     A_UINT32  MessageID : 16, /* ID */
184               CreditCount: 16;  /* number of credits the target can offer */
185     A_UINT32  CreditSize : 16,   /* size of each credit */
186               MaxEndpoints : 8, /* maximum number of endpoints the target has resources for */
187               _Pad1 : 8;
188 } POSTPACK HTC_READY_MSG;
189 
190 #define HTC_READY_MSG_MESSAGEID_LSB                   0
191 #define HTC_READY_MSG_MESSAGEID_MASK                  0x0000ffff
192 #define HTC_READY_MSG_MESSAGEID_OFFSET                0x00000000
193 #define HTC_READY_MSG_CREDITCOUNT_LSB                 16
194 #define HTC_READY_MSG_CREDITCOUNT_MASK                0xffff0000
195 #define HTC_READY_MSG_CREDITCOUNT_OFFSET              0x00000000
196 #define HTC_READY_MSG_CREDITSIZE_LSB                  0
197 #define HTC_READY_MSG_CREDITSIZE_MASK                 0x0000ffff
198 #define HTC_READY_MSG_CREDITSIZE_OFFSET               0x00000004
199 #define HTC_READY_MSG_MAXENDPOINTS_LSB                16
200 #define HTC_READY_MSG_MAXENDPOINTS_MASK               0x00ff0000
201 #define HTC_READY_MSG_MAXENDPOINTS_OFFSET             0x00000004
202 
203     /* extended HTC ready message */
204 typedef PREPACK struct {
205     HTC_READY_MSG   Version2_0_Info;   /* legacy version 2.0 information at the front... */
206     /* extended information */
207     A_UINT32        HTCVersion : 8,
208                     MaxMsgsPerHTCBundle : 8, /* used in SDIO systems */
209                     AltDataCreditSize : 12,  /* used in HL (SDIO/USB) systems */
210                     reserved : 4;
211 } POSTPACK HTC_READY_EX_MSG;
212 
213 #define HTC_READY_EX_MSG_HTCVERSION_LSB               0
214 #define HTC_READY_EX_MSG_HTCVERSION_MASK              0x000000ff
215 #define HTC_READY_EX_MSG_HTCVERSION_OFFSET            sizeof(HTC_READY_MSG)
216 #define HTC_READY_EX_MSG_MAXMSGSPERHTCBUNDLE_LSB      8
217 #define HTC_READY_EX_MSG_MAXMSGSPERHTCBUNDLE_MASK     0x0000ff00
218 #define HTC_READY_EX_MSG_MAXMSGSPERHTCBUNDLE_OFFSET   sizeof(HTC_READY_MSG)
219 
220 #define HTC_VERSION_2P0  0x00
221 #define HTC_VERSION_2P1  0x01  /* HTC 2.1 */
222 
223 #define HTC_SERVICE_META_DATA_MAX_LENGTH 128
224 
225 /* connect service
226  * direction : host-to-target */
227 typedef PREPACK struct {
228     A_UINT32  MessageID : 16,
229               ServiceID : 16;           /* service ID of the service to connect to */
230     A_UINT32  ConnectionFlags : 16,     /* connection flags */
231 
232 #define HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE (1 << 2)  /* reduce credit dribbling when
233                                                              the host needs credits */
234 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK             (0x3)
235 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH        0x0
236 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF          0x1
237 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS     0x2
238 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_UNITY             0x3
239     /* disable credit flow control on a specific service */
240 #define HTC_CONNECT_FLAGS_DISABLE_CREDIT_FLOW_CTRL          (1 << 3)
241     /* enable htc schedule on a specific service */
242 #define HTC_CONNECT_FLAGS_ENABLE_HTC_SCHEDULE          (1 << 4)
243 
244               ServiceMetaLength : 8,   /* length of meta data that follows */
245               LookAheadV2 : 1, /* 1 if host supports HTC_LOOKAHEAD_REPORT_V2 */
246               _Pad1 : 7;
247 
248     /* service-specific meta data starts after the header */
249 
250 } POSTPACK HTC_CONNECT_SERVICE_MSG;
251 
252 #define HTC_CONNECT_SERVICE_MSG_MESSAGEID_LSB             0
253 #define HTC_CONNECT_SERVICE_MSG_MESSAGEID_MASK            0x0000ffff
254 #define HTC_CONNECT_SERVICE_MSG_MESSAGEID_OFFSET          0x00000000
255 #define HTC_CONNECT_SERVICE_MSG_SERVICE_ID_LSB            16
256 #define HTC_CONNECT_SERVICE_MSG_SERVICE_ID_MASK           0xffff0000
257 #define HTC_CONNECT_SERVICE_MSG_SERVICE_ID_OFFSET         0x00000000
258 #define HTC_CONNECT_SERVICE_MSG_CONNECTIONFLAGS_LSB       0
259 #define HTC_CONNECT_SERVICE_MSG_CONNECTIONFLAGS_MASK      0x0000ffff
260 #define HTC_CONNECT_SERVICE_MSG_CONNECTIONFLAGS_OFFSET    0x00000004
261 #define HTC_CONNECT_SERVICE_MSG_SERVICEMETALENGTH_LSB     16
262 #define HTC_CONNECT_SERVICE_MSG_SERVICEMETALENGTH_MASK    0x00ff0000
263 #define HTC_CONNECT_SERVICE_MSG_SERVICEMETALENGTH_OFFSET  0x00000004
264 
265 #define HTC_SET_RECV_ALLOC_SHIFT    8
266 #define HTC_SET_RECV_ALLOC_MASK     0xFF00
267 #define HTC_CONNECT_FLAGS_SET_RECV_ALLOCATION(value) (((A_UINT8)value) << HTC_SET_RECV_ALLOC_SHIFT)
268 #define HTC_CONNECT_FLAGS_GET_RECV_ALLOCATION(value) (A_UINT8)(((value) & HTC_SET_RECV_ALLOC_MASK) >> HTC_SET_RECV_ALLOC_SHIFT)
269 
270 /* connect response
271  * direction : target-to-host */
272 typedef PREPACK struct {
273     A_UINT32  MessageID : 16,
274               ServiceID : 16;       /* service ID that the connection request was made */
275     A_UINT32  Status : 8,           /* service connection status */
276               EndpointID : 8,       /* assigned endpoint ID */
277               MaxMsgSize : 16;      /* maximum expected message size on this endpoint */
278     A_UINT32  ServiceMetaLength : 8,    /* length of meta data that follows */
279               LookAheadV2 : 1,/* 1 if target supports HTC_LOOKAHEAD_REPORT_V2 */
280               _Pad1 : 7,
281               reserved : 16;
282 
283     /* service-specific meta data starts after the header */
284 
285 } POSTPACK HTC_CONNECT_SERVICE_RESPONSE_MSG;
286 
287 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MESSAGEID_LSB            0
288 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MESSAGEID_MASK           0x0000ffff
289 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MESSAGEID_OFFSET         0x00000000
290 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEID_LSB            16
291 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEID_MASK           0xffff0000
292 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEID_OFFSET         0x00000000
293 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_STATUS_LSB               0
294 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_STATUS_MASK              0x000000ff
295 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_STATUS_OFFSET            0x00000004
296 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_ENDPOINTID_LSB           8
297 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_ENDPOINTID_MASK          0x0000ff00
298 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_ENDPOINTID_OFFSET        0x00000004
299 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MAXMSGSIZE_LSB           16
300 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MAXMSGSIZE_MASK          0xffff0000
301 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_MAXMSGSIZE_OFFSET        0x00000004
302 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEMETALENGTH_LSB    0
303 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEMETALENGTH_MASK   0x000000ff
304 #define HTC_CONNECT_SERVICE_RESPONSE_MSG_SERVICEMETALENGTH_OFFSET 0x00000008
305 
306 typedef PREPACK struct {
307     A_UINT32  MessageID : 16,
308               reserved : 16;
309     /* currently, no other fields */
310 } POSTPACK HTC_SETUP_COMPLETE_MSG;
311 
312 #define HTC_SETUP_COMPLETE_MSG_MESSAGEID_LSB          0
313 #define HTC_SETUP_COMPLETE_MSG_MESSAGEID_MASK         0x0000ffff
314 #define HTC_SETUP_COMPLETE_MSG_MESSAGEID_OFFSET       0x00000000
315 
316     /* extended setup completion message */
317 typedef PREPACK struct {
318     A_UINT32  MessageID : 16,
319               reserved : 16;
320     A_UINT32  SetupFlags : 32;
321     A_UINT32  MaxMsgsPerBundledRecv : 8,
322               Rsvd0 : 8,
323               Rsvd1 : 8,
324               Rsvd2 : 8;
325 } POSTPACK HTC_SETUP_COMPLETE_EX_MSG;
326 
327 #define HTC_SETUP_COMPLETE_EX_MSG_MESSAGEID_LSB               0
328 #define HTC_SETUP_COMPLETE_EX_MSG_MESSAGEID_MASK              0x0000ffff
329 #define HTC_SETUP_COMPLETE_EX_MSG_MESSAGEID_OFFSET            0x00000000
330 #define HTC_SETUP_COMPLETE_EX_MSG_SETUPFLAGS_LSB              0
331 #define HTC_SETUP_COMPLETE_EX_MSG_SETUPFLAGS_MASK             0xffffffff
332 #define HTC_SETUP_COMPLETE_EX_MSG_SETUPFLAGS_OFFSET           0x00000004
333 #define HTC_SETUP_COMPLETE_EX_MSG_MAXMSGSPERBUNDLEDRECV_LSB       0
334 #define HTC_SETUP_COMPLETE_EX_MSG_MAXMSGSPERBUNDLEDRECV_MASK      0x000000ff
335 #define HTC_SETUP_COMPLETE_EX_MSG_MAXMSGSPERBUNDLEDRECV_OFFSET    0x00000008
336 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD0_LSB                   8
337 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD0_MASK                  0x0000ff00
338 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD0_OFFSET                0x00000008
339 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD1_LSB                   16
340 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD1_MASK                  0x00ff0000
341 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD1_OFFSET                0x00000008
342 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD2_LSB                   24
343 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD2_MASK                  0xff000000
344 #define HTC_SETUP_COMPLETE_EX_MSG_RSVD2_OFFSET                0x00000008
345 
346 #define HTC_SETUP_COMPLETE_FLAGS_ENABLE_BUNDLE_RECV     (1 << 0)    /* enable recv bundling from target */
347 #define HTC_SETUP_COMPLETE_FLAGS_DISABLE_TX_CREDIT_FLOW (1 << 1)    /* disable credit based flow control,
348                                                                        only supported on some interconnects */
349 
350 /* connect response status codes */
351 #define HTC_SERVICE_SUCCESS      0  /* success */
352 #define HTC_SERVICE_NOT_FOUND    1  /* service could not be found */
353 #define HTC_SERVICE_FAILED       2  /* specific service failed the connect */
354 #define HTC_SERVICE_NO_RESOURCES 3  /* no resources (i.e. no more endpoints) */
355 #define HTC_SERVICE_NO_MORE_EP   4  /* specific service is not allowing any more
356                                        endpoints */
357 
358 /* report record IDs */
359 
360 #define HTC_RECORD_NULL             0
361 #define HTC_RECORD_CREDITS          1
362 #define HTC_RECORD_LOOKAHEAD        2
363 #define HTC_RECORD_LOOKAHEAD_BUNDLE 3
364 
365 typedef PREPACK struct {
366     A_UINT32 RecordID : 8, /* Record ID */
367              Length : 8,   /* Length of record */
368              reserved : 16;
369 } POSTPACK HTC_RECORD_HDR;
370 
371 #define HTC_RECORD_HDR_RECORDID_LSB           0
372 #define HTC_RECORD_HDR_RECORDID_MASK          0x000000ff
373 #define HTC_RECORD_HDR_RECORDID_OFFSET        0x00000000
374 #define HTC_RECORD_HDR_LENGTH_LSB             8
375 #define HTC_RECORD_HDR_LENGTH_MASK            0x0000ff00
376 #define HTC_RECORD_HDR_LENGTH_OFFSET          0x00000000
377 
378 typedef PREPACK struct {
379     A_UINT32 EndpointID : 8,     /* Endpoint that owns these credits */
380              Credits : 8,        /* credits to report since last report */
381              reserved : 16;
382 } POSTPACK HTC_CREDIT_REPORT;
383 
384 #define HTC_CREDIT_REPORT_ENDPOINTID_LSB      0
385 #define HTC_CREDIT_REPORT_ENDPOINTID_MASK     0x000000ff
386 #define HTC_CREDIT_REPORT_ENDPOINTID_OFFSET   0x00000000
387 #define HTC_CREDIT_REPORT_CREDITS_LSB         8
388 #define HTC_CREDIT_REPORT_CREDITS_MASK        0x0000ff00
389 #define HTC_CREDIT_REPORT_CREDITS_OFFSET      0x00000000
390 
391 typedef PREPACK struct {
392     A_UINT32 PreValid : 8,      /* pre valid guard */
393              reserved0 : 24;
394     A_UINT32 LookAhead0 : 8,    /* 4 byte lookahead */
395              LookAhead1 : 8,
396              LookAhead2 : 8,
397              LookAhead3 : 8;
398     A_UINT32 PostValid : 8,     /* post valid guard */
399              reserved1 : 24;
400 
401    /* NOTE: the LookAhead array is guarded by a PreValid and Post Valid guard bytes.
402     * The PreValid bytes must equal the inverse of the PostValid byte */
403 
404 } POSTPACK HTC_LOOKAHEAD_REPORT;
405 
406 /*
407  * If the host sets the HTC_CONNECT_SERVICE_MSG.LookAheadV2 flag and the
408  * target sets the HTC_CONNECT_SERVICE_RESPONSE_MSG.LookAheadV2 flag,
409  * HTC_LOOKAHEAD_REPORT_V2 is used; otherwise HTC_LOOKAHEAD_REPORT is used.
410  */
411 typedef PREPACK struct {
412     A_UINT32 PreValid : 8,   /* pre valid guard */
413         reserved0 : 24;
414     A_UINT32 LookAhead0 : 8,  /* 8 byte lookahead */
415         LookAhead1 : 8,
416         LookAhead2 : 8,
417         LookAhead3 : 8;
418     A_UINT32 LookAhead4 : 8,  /* 8 byte lookahead */
419         LookAhead5 : 8,
420         LookAhead6 : 8,
421         LookAhead7 : 8;
422     A_UINT32 PostValid : 8,   /* post valid guard */
423         reserved1 : 24;
424     /* NOTE: the LookAhead array is guarded by PreValid and Post Valid
425      * guard bytes.
426      * The PreValid byte must equal the inverse of the PostValid byte.
427      */
428 } POSTPACK HTC_LOOKAHEAD_REPORT_V2;
429 
430 #define HTC_LOOKAHEAD_REPORT_PREVALID_LSB         0
431 #define HTC_LOOKAHEAD_REPORT_PREVALID_MASK        0x000000ff
432 #define HTC_LOOKAHEAD_REPORT_PREVALID_OFFSET      0x00000000
433 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD0_LSB       0
434 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD0_MASK      0x000000ff
435 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD0_OFFSET    0x00000004
436 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD1_LSB       8
437 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD1_MASK      0x0000ff00
438 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD1_OFFSET    0x00000004
439 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD2_LSB       16
440 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD2_MASK      0x00ff0000
441 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD2_OFFSET    0x00000004
442 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD3_LSB       24
443 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD3_MASK      0xff000000
444 #define HTC_LOOKAHEAD_REPORT_LOOKAHEAD3_OFFSET    0x00000004
445 #define HTC_LOOKAHEAD_REPORT_POSTVALID_LSB        0
446 #define HTC_LOOKAHEAD_REPORT_POSTVALID_MASK       0x000000ff
447 #define HTC_LOOKAHEAD_REPORT_POSTVALID_OFFSET     0x00000008
448 
449 typedef PREPACK struct {
450     A_UINT32 LookAhead0 : 8,    /* 4 byte lookahead */
451              LookAhead1 : 8,
452              LookAhead2 : 8,
453              LookAhead3 : 8;
454 } POSTPACK HTC_BUNDLED_LOOKAHEAD_REPORT;
455 
456 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD0_LSB           0
457 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD0_MASK          0x000000ff
458 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD0_OFFSET        0x00000000
459 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD1_LSB           8
460 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD1_MASK          0x0000ff00
461 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD1_OFFSET        0x00000000
462 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD2_LSB           16
463 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD2_MASK          0x00ff0000
464 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD2_OFFSET        0x00000000
465 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD3_LSB           24
466 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD3_MASK          0xff000000
467 #define HTC_BUNDLED_LOOKAHEAD_REPORT_LOOKAHEAD3_OFFSET        0x00000000
468 
469 #ifndef ATH_TARGET
470 #include "athendpack.h"
471 #endif
472 
473 
474 #endif /* __HTC_H__ */
475 
476