Merge branch 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / staging / ath6kl / include / common / htc.h
1 //------------------------------------------------------------------------------
2 // <copyright file="htc.h" company="Atheros">
3 //    Copyright (c) 2004-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
24 #ifndef __HTC_H__
25 #define __HTC_H__
26
27 #ifndef ATH_TARGET
28 #include "athstartpack.h"
29 #endif
30
31 #define A_OFFSETOF(type,field) (unsigned long)(&(((type *)NULL)->field))
32
33 #define ASSEMBLE_UNALIGNED_UINT16(p,highbyte,lowbyte) \
34         (((A_UINT16)(((A_UINT8 *)(p))[(highbyte)])) << 8 | (A_UINT16)(((A_UINT8 *)(p))[(lowbyte)]))
35         
36 /* alignment independent macros (little-endian) to fetch UINT16s or UINT8s from a 
37  * structure using only the type and field name.
38  * Use these macros if there is the potential for unaligned buffer accesses. */
39 #define A_GET_UINT16_FIELD(p,type,field) \
40     ASSEMBLE_UNALIGNED_UINT16(p,\
41                               A_OFFSETOF(type,field) + 1, \
42                               A_OFFSETOF(type,field))
43
44 #define A_SET_UINT16_FIELD(p,type,field,value) \
45 {                                              \
46     ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (A_UINT8)(value);        \
47     ((A_UINT8 *)(p))[A_OFFSETOF(type,field) + 1] = (A_UINT8)((value) >> 8); \
48 }
49   
50 #define A_GET_UINT8_FIELD(p,type,field) \
51             ((A_UINT8 *)(p))[A_OFFSETOF(type,field)]
52             
53 #define A_SET_UINT8_FIELD(p,type,field,value) \
54     ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (value)
55
56 /****** DANGER DANGER ***************
57  * 
58  *   The frame header length and message formats defined herein were
59  *   selected to accommodate optimal alignment for target processing.  This reduces code
60  *   size and improves performance.
61  * 
62  *   Any changes to the header length may alter the alignment and cause exceptions
63  *   on the target. When adding to the message structures insure that fields are
64  *   properly aligned.
65  * 
66  */
67
68 /* HTC frame header */
69 typedef PREPACK struct _HTC_FRAME_HDR{
70         /* do not remove or re-arrange these fields, these are minimally required
71          * to take advantage of 4-byte lookaheads in some hardware implementations */
72     A_UINT8   EndpointID;
73     A_UINT8   Flags;
74     A_UINT16  PayloadLen;       /* length of data (including trailer) that follows the header */
75     
76     /***** end of 4-byte lookahead ****/
77     
78     A_UINT8   ControlBytes[2];
79     
80     /* message payload starts after the header */
81     
82 } POSTPACK HTC_FRAME_HDR;
83
84 /* frame header flags */
85
86     /* send direction */
87 #define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0)
88 #define HTC_FLAGS_SEND_BUNDLE        (1 << 1)  /* start or part of bundle */
89     /* receive direction */
90 #define HTC_FLAGS_RECV_UNUSED_0      (1 << 0)  /* bit 0 unused */    
91 #define HTC_FLAGS_RECV_TRAILER       (1 << 1)  /* bit 1 trailer data present */
92 #define HTC_FLAGS_RECV_UNUSED_2      (1 << 0)  /* bit 2 unused */
93 #define HTC_FLAGS_RECV_UNUSED_3      (1 << 0)  /* bit 3 unused */
94 #define HTC_FLAGS_RECV_BUNDLE_CNT_MASK (0xF0)  /* bits 7..4  */
95 #define HTC_FLAGS_RECV_BUNDLE_CNT_SHIFT 4
96
97 #define HTC_HDR_LENGTH  (sizeof(HTC_FRAME_HDR))
98 #define HTC_MAX_TRAILER_LENGTH   255
99 #define HTC_MAX_PAYLOAD_LENGTH   (4096 - sizeof(HTC_FRAME_HDR))
100
101 /* HTC control message IDs */
102
103 #define HTC_MSG_READY_ID                    1
104 #define HTC_MSG_CONNECT_SERVICE_ID          2
105 #define HTC_MSG_CONNECT_SERVICE_RESPONSE_ID 3   
106 #define HTC_MSG_SETUP_COMPLETE_ID           4
107 #define HTC_MSG_SETUP_COMPLETE_EX_ID        5
108
109 #define HTC_MAX_CONTROL_MESSAGE_LENGTH  256
110          
111 /* base message ID header */
112 typedef PREPACK struct {
113     A_UINT16 MessageID;    
114 } POSTPACK HTC_UNKNOWN_MSG;
115                                                      
116 /* HTC ready message
117  * direction : target-to-host  */
118 typedef PREPACK struct {
119     A_UINT16  MessageID;    /* ID */
120     A_UINT16  CreditCount;  /* number of credits the target can offer */       
121     A_UINT16  CreditSize;   /* size of each credit */
122     A_UINT8   MaxEndpoints; /* maximum number of endpoints the target has resources for */
123     A_UINT8   _Pad1;
124 } POSTPACK HTC_READY_MSG;
125
126     /* extended HTC ready message */
127 typedef PREPACK struct {
128     HTC_READY_MSG   Version2_0_Info;   /* legacy version 2.0 information at the front... */
129     /* extended information */
130     A_UINT8         HTCVersion;
131     A_UINT8         MaxMsgsPerHTCBundle;
132 } POSTPACK HTC_READY_EX_MSG;
133
134 #define HTC_VERSION_2P0  0x00  
135 #define HTC_VERSION_2P1  0x01  /* HTC 2.1 */
136
137 #define HTC_SERVICE_META_DATA_MAX_LENGTH 128
138
139 /* connect service
140  * direction : host-to-target */
141 typedef PREPACK struct {
142     A_UINT16  MessageID;
143     A_UINT16  ServiceID;           /* service ID of the service to connect to */       
144     A_UINT16  ConnectionFlags;     /* connection flags */
145
146 #define HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE (1 << 2)  /* reduce credit dribbling when 
147                                                              the host needs credits */  
148 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK             (0x3)  
149 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH        0x0
150 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF          0x1
151 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS     0x2
152 #define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_UNITY             0x3
153                                                              
154     A_UINT8   ServiceMetaLength;   /* length of meta data that follows */
155     A_UINT8   _Pad1;
156     
157     /* service-specific meta data starts after the header */
158     
159 } POSTPACK HTC_CONNECT_SERVICE_MSG;
160
161 /* connect response
162  * direction : target-to-host */
163 typedef PREPACK struct {
164     A_UINT16  MessageID;
165     A_UINT16  ServiceID;            /* service ID that the connection request was made */
166     A_UINT8   Status;               /* service connection status */ 
167     A_UINT8   EndpointID;           /* assigned endpoint ID */
168     A_UINT16  MaxMsgSize;           /* maximum expected message size on this endpoint */
169     A_UINT8   ServiceMetaLength;    /* length of meta data that follows */
170     A_UINT8   _Pad1;               
171     
172     /* service-specific meta data starts after the header */
173     
174 } POSTPACK HTC_CONNECT_SERVICE_RESPONSE_MSG;
175
176 typedef PREPACK struct {
177     A_UINT16  MessageID;
178     /* currently, no other fields */
179 } POSTPACK HTC_SETUP_COMPLETE_MSG;
180
181     /* extended setup completion message */
182 typedef PREPACK struct {
183     A_UINT16  MessageID;
184     A_UINT32  SetupFlags;
185     A_UINT8   MaxMsgsPerBundledRecv;
186     A_UINT8   Rsvd[3];
187 } POSTPACK HTC_SETUP_COMPLETE_EX_MSG;
188
189 #define HTC_SETUP_COMPLETE_FLAGS_ENABLE_BUNDLE_RECV     (1 << 0)
190
191 /* connect response status codes */
192 #define HTC_SERVICE_SUCCESS      0  /* success */
193 #define HTC_SERVICE_NOT_FOUND    1  /* service could not be found */
194 #define HTC_SERVICE_FAILED       2  /* specific service failed the connect */
195 #define HTC_SERVICE_NO_RESOURCES 3  /* no resources (i.e. no more endpoints) */  
196 #define HTC_SERVICE_NO_MORE_EP   4  /* specific service is not allowing any more 
197                                        endpoints */
198
199 /* report record IDs */
200
201 #define HTC_RECORD_NULL             0
202 #define HTC_RECORD_CREDITS          1
203 #define HTC_RECORD_LOOKAHEAD        2
204 #define HTC_RECORD_LOOKAHEAD_BUNDLE 3
205
206 typedef PREPACK struct {
207     A_UINT8 RecordID;     /* Record ID */
208     A_UINT8 Length;       /* Length of record */
209 } POSTPACK HTC_RECORD_HDR;
210
211 typedef PREPACK struct {
212     A_UINT8 EndpointID;     /* Endpoint that owns these credits */
213     A_UINT8 Credits;        /* credits to report since last report */
214 } POSTPACK HTC_CREDIT_REPORT;
215
216 typedef PREPACK struct {    
217     A_UINT8 PreValid;         /* pre valid guard */
218     A_UINT8 LookAhead[4];     /* 4 byte lookahead */
219     A_UINT8 PostValid;        /* post valid guard */
220     
221    /* NOTE: the LookAhead array is guarded by a PreValid and Post Valid guard bytes.
222     * The PreValid bytes must equal the inverse of the PostValid byte */
223     
224 } POSTPACK HTC_LOOKAHEAD_REPORT;
225
226 typedef PREPACK struct {    
227     A_UINT8 LookAhead[4];     /* 4 byte lookahead */    
228 } POSTPACK HTC_BUNDLED_LOOKAHEAD_REPORT;
229
230 #ifndef ATH_TARGET
231 #include "athendpack.h"
232 #endif
233
234
235 #endif /* __HTC_H__ */
236