VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / usb / gadget / rndis.h
1 /* 
2  * RNDIS        Definitions for Remote NDIS
3  * 
4  * Version:     $Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $
5  * 
6  * Authors:     Benedikt Spranger, Pengutronix
7  *              Robert Schwebel, Pengutronix
8  * 
9  *              This program is free software; you can redistribute it and/or
10  *              modify it under the terms of the GNU General Public License
11  *              version 2, as published by the Free Software Foundation. 
12  * 
13  *              This software was originally developed in conformance with
14  *              Microsoft's Remote NDIS Specification License Agreement.
15  */
16
17 #ifndef _LINUX_RNDIS_H
18 #define _LINUX_RNDIS_H
19
20 #include "ndis.h"
21
22 #define RNDIS_MAXIMUM_FRAME_SIZE        1518
23 #define RNDIS_MAX_TOTAL_SIZE            1558
24
25 /* Remote NDIS Versions */
26 #define RNDIS_MAJOR_VERSION             1
27 #define RNDIS_MINOR_VERSION             0
28
29 /* Status Values */
30 #define RNDIS_STATUS_SUCCESS            0x00000000U     /* Success           */
31 #define RNDIS_STATUS_FAILURE            0xC0000001U     /* Unspecified error */
32 #define RNDIS_STATUS_INVALID_DATA       0xC0010015U     /* Invalid data      */
33 #define RNDIS_STATUS_NOT_SUPPORTED      0xC00000BBU     /* Unsupported request */
34 #define RNDIS_STATUS_MEDIA_CONNECT      0x4001000BU     /* Device connected  */
35 #define RNDIS_STATUS_MEDIA_DISCONNECT   0x4001000CU     /* Device disconnected */
36 /* For all not specified status messages:
37  * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 
38  */
39
40 /* Message Set for Connectionless (802.3) Devices */
41 #define REMOTE_NDIS_INITIALIZE_MSG      0x00000002U     /* Initialize device */
42 #define REMOTE_NDIS_HALT_MSG            0x00000003U
43 #define REMOTE_NDIS_QUERY_MSG           0x00000004U
44 #define REMOTE_NDIS_SET_MSG             0x00000005U
45 #define REMOTE_NDIS_RESET_MSG           0x00000006U
46 #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007U
47 #define REMOTE_NDIS_KEEPALIVE_MSG       0x00000008U
48
49 /* Message completion */
50 #define REMOTE_NDIS_INITIALIZE_CMPLT    0x80000002U
51 #define REMOTE_NDIS_QUERY_CMPLT         0x80000004U
52 #define REMOTE_NDIS_SET_CMPLT           0x80000005U
53 #define REMOTE_NDIS_RESET_CMPLT         0x80000006U
54 #define REMOTE_NDIS_KEEPALIVE_CMPLT     0x80000008U
55
56 /* Device Flags */
57 #define RNDIS_DF_CONNECTIONLESS         0x00000001U
58 #define RNDIS_DF_CONNECTION_ORIENTED    0x00000002U
59
60 #define RNDIS_MEDIUM_802_3              0x00000000U
61
62 /* from drivers/net/sk98lin/h/skgepnmi.h */
63 #define OID_PNP_CAPABILITIES                    0xFD010100
64 #define OID_PNP_SET_POWER                       0xFD010101
65 #define OID_PNP_QUERY_POWER                     0xFD010102
66 #define OID_PNP_ADD_WAKE_UP_PATTERN             0xFD010103
67 #define OID_PNP_REMOVE_WAKE_UP_PATTERN          0xFD010104
68 #define OID_PNP_ENABLE_WAKE_UP                  0xFD010106
69
70
71 /* supported OIDs */
72 static const u32 oid_supported_list [] = 
73 {
74         /* the general stuff */
75         OID_GEN_SUPPORTED_LIST,
76         OID_GEN_HARDWARE_STATUS,
77         OID_GEN_MEDIA_SUPPORTED,
78         OID_GEN_MEDIA_IN_USE,
79         OID_GEN_MAXIMUM_FRAME_SIZE,
80         OID_GEN_LINK_SPEED,
81         OID_GEN_TRANSMIT_BLOCK_SIZE,
82         OID_GEN_RECEIVE_BLOCK_SIZE,
83         OID_GEN_VENDOR_ID,
84         OID_GEN_VENDOR_DESCRIPTION,
85         OID_GEN_VENDOR_DRIVER_VERSION,
86         OID_GEN_CURRENT_PACKET_FILTER,
87         OID_GEN_MAXIMUM_TOTAL_SIZE,
88         OID_GEN_MEDIA_CONNECT_STATUS,
89         OID_GEN_PHYSICAL_MEDIUM,
90 #if 0
91         OID_GEN_RNDIS_CONFIG_PARAMETER,
92 #endif
93         
94         /* the statistical stuff */
95         OID_GEN_XMIT_OK,
96         OID_GEN_RCV_OK,
97         OID_GEN_XMIT_ERROR,
98         OID_GEN_RCV_ERROR,
99         OID_GEN_RCV_NO_BUFFER,
100 #ifdef  RNDIS_OPTIONAL_STATS
101         OID_GEN_DIRECTED_BYTES_XMIT,
102         OID_GEN_DIRECTED_FRAMES_XMIT,
103         OID_GEN_MULTICAST_BYTES_XMIT,
104         OID_GEN_MULTICAST_FRAMES_XMIT,
105         OID_GEN_BROADCAST_BYTES_XMIT,
106         OID_GEN_BROADCAST_FRAMES_XMIT,
107         OID_GEN_DIRECTED_BYTES_RCV,
108         OID_GEN_DIRECTED_FRAMES_RCV,
109         OID_GEN_MULTICAST_BYTES_RCV,
110         OID_GEN_MULTICAST_FRAMES_RCV,
111         OID_GEN_BROADCAST_BYTES_RCV,
112         OID_GEN_BROADCAST_FRAMES_RCV,
113         OID_GEN_RCV_CRC_ERROR,
114         OID_GEN_TRANSMIT_QUEUE_LENGTH,
115 #endif  /* RNDIS_OPTIONAL_STATS */
116
117         /* mandatory 802.3 */
118         /* the general stuff */
119         OID_802_3_PERMANENT_ADDRESS,
120         OID_802_3_CURRENT_ADDRESS,
121         OID_802_3_MULTICAST_LIST,
122         OID_802_3_MAC_OPTIONS,
123         OID_802_3_MAXIMUM_LIST_SIZE,
124         
125         /* the statistical stuff */
126         OID_802_3_RCV_ERROR_ALIGNMENT,
127         OID_802_3_XMIT_ONE_COLLISION,
128         OID_802_3_XMIT_MORE_COLLISIONS,
129 #ifdef  RNDIS_OPTIONAL_STATS
130         OID_802_3_XMIT_DEFERRED,
131         OID_802_3_XMIT_MAX_COLLISIONS,
132         OID_802_3_RCV_OVERRUN,
133         OID_802_3_XMIT_UNDERRUN,
134         OID_802_3_XMIT_HEARTBEAT_FAILURE,
135         OID_802_3_XMIT_TIMES_CRS_LOST,
136         OID_802_3_XMIT_LATE_COLLISIONS,
137 #endif  /* RNDIS_OPTIONAL_STATS */
138
139 #ifdef  RNDIS_PM
140         /* PM and wakeup are mandatory for USB: */
141
142         /* power management */
143         OID_PNP_CAPABILITIES,
144         OID_PNP_QUERY_POWER,
145         OID_PNP_SET_POWER,
146
147         /* wake up host */
148         OID_PNP_ENABLE_WAKE_UP,
149         OID_PNP_ADD_WAKE_UP_PATTERN,
150         OID_PNP_REMOVE_WAKE_UP_PATTERN,
151 #endif
152 };
153
154
155 typedef struct rndis_init_msg_type 
156 {
157         u32     MessageType;
158         u32     MessageLength;
159         u32     RequestID;
160         u32     MajorVersion;
161         u32     MinorVersion;
162         u32     MaxTransferSize;
163 } rndis_init_msg_type;
164
165 typedef struct rndis_init_cmplt_type
166 {
167         u32     MessageType;
168         u32     MessageLength;
169         u32     RequestID;
170         u32     Status;
171         u32     MajorVersion;
172         u32     MinorVersion;
173         u32     DeviceFlags;
174         u32     Medium;
175         u32     MaxPacketsPerTransfer;
176         u32     MaxTransferSize;
177         u32     PacketAlignmentFactor;
178         u32     AFListOffset;
179         u32     AFListSize;
180 } rndis_init_cmplt_type;
181
182 typedef struct rndis_halt_msg_type
183 {
184         u32     MessageType;
185         u32     MessageLength;
186         u32     RequestID;
187 } rndis_halt_msg_type;
188
189 typedef struct rndis_query_msg_type
190 {
191         u32     MessageType;
192         u32     MessageLength;
193         u32     RequestID;
194         u32     OID;
195         u32     InformationBufferLength;
196         u32     InformationBufferOffset;
197         u32     DeviceVcHandle;
198 } rndis_query_msg_type;
199
200 typedef struct rndis_query_cmplt_type
201 {
202         u32     MessageType;
203         u32     MessageLength;
204         u32     RequestID;
205         u32     Status;
206         u32     InformationBufferLength;
207         u32     InformationBufferOffset;
208 } rndis_query_cmplt_type;
209
210 typedef struct rndis_set_msg_type
211 {
212         u32     MessageType;
213         u32     MessageLength;
214         u32     RequestID;
215         u32     OID;
216         u32     InformationBufferLength;
217         u32     InformationBufferOffset;
218         u32     DeviceVcHandle;
219 } rndis_set_msg_type;
220
221 typedef struct rndis_set_cmplt_type
222 {
223         u32     MessageType;
224         u32     MessageLength;
225         u32     RequestID;
226         u32     Status;
227 } rndis_set_cmplt_type;
228
229 typedef struct rndis_reset_msg_type
230 {
231         u32     MessageType;
232         u32     MessageLength;
233         u32     Reserved;
234 } rndis_reset_msg_type;
235
236 typedef struct rndis_reset_cmplt_type
237 {
238         u32     MessageType;
239         u32     MessageLength;
240         u32     Status;
241         u32     AddressingReset;
242 } rndis_reset_cmplt_type;
243
244 typedef struct rndis_indicate_status_msg_type
245 {
246         u32     MessageType;
247         u32     MessageLength;
248         u32     Status;
249         u32     StatusBufferLength;
250         u32     StatusBufferOffset;
251 } rndis_indicate_status_msg_type;
252
253 typedef struct rndis_keepalive_msg_type
254 {
255         u32     MessageType;
256         u32     MessageLength;
257         u32     RequestID;
258 } rndis_keepalive_msg_type;
259
260 typedef struct rndis_keepalive_cmplt_type
261 {
262         u32     MessageType;
263         u32     MessageLength;
264         u32     RequestID;
265         u32     Status;
266 } rndis_keepalive_cmplt_type;
267
268 struct rndis_packet_msg_type
269 {
270         u32     MessageType;
271         u32     MessageLength;
272         u32     DataOffset;
273         u32     DataLength;
274         u32     OOBDataOffset;
275         u32     OOBDataLength;
276         u32     NumOOBDataElements;
277         u32     PerPacketInfoOffset;
278         u32     PerPacketInfoLength;
279         u32     VcHandle;
280         u32     Reserved;
281 };
282
283 struct rndis_config_parameter
284 {
285         u32     ParameterNameOffset;
286         u32     ParameterNameLength;
287         u32     ParameterType;
288         u32     ParameterValueOffset;
289         u32     ParameterValueLength;
290 };
291
292 /* implementation specific */
293 enum rndis_state
294 {
295         RNDIS_UNINITIALIZED,
296         RNDIS_INITIALIZED,
297         RNDIS_DATA_INITIALIZED,
298 };
299
300 typedef struct rndis_resp_t
301 {
302         struct list_head        list;
303         u8                      *buf;
304         u32                     length;
305         int                     send;
306 } rndis_resp_t;
307
308 typedef struct rndis_params
309 {
310         u8                      confignr;
311         int                     used;
312         enum rndis_state        state;
313         u32                     filter;
314         u32                     medium;
315         u32                     speed;
316         u32                     media_state;
317         const u8                *host_mac;
318         struct net_device       *dev;
319         struct net_device_stats *stats;
320         u32                     vendorID;
321         const char              *vendorDescr;
322         int                     (*ack) (struct net_device *);
323         struct list_head        resp_queue;
324 } rndis_params;
325
326 /* RNDIS Message parser and other useless functions */
327 int  rndis_msg_parser (u8 configNr, u8 *buf);
328 int  rndis_register (int (*rndis_control_ack) (struct net_device *));
329 void rndis_deregister (int configNr);
330 int  rndis_set_param_dev (u8 configNr, struct net_device *dev,
331                          struct net_device_stats *stats);
332 int  rndis_set_param_vendor (u8 configNr, u32 vendorID, 
333                             const char *vendorDescr);
334 int  rndis_set_param_medium (u8 configNr, u32 medium, u32 speed);
335 void rndis_add_hdr (struct sk_buff *skb);
336 int  rndis_rm_hdr (u8 *buf, u32 *length);
337 u8   *rndis_get_next_response (int configNr, u32 *length);
338 void rndis_free_response (int configNr, u8 *buf);
339
340 int  rndis_signal_connect (int configNr);
341 int  rndis_signal_disconnect (int configNr);
342 int  rndis_state (int configNr);
343 extern void rndis_set_host_mac (int configNr, const u8 *addr);
344
345 int __init rndis_init (void);
346 void rndis_exit (void);
347
348 #endif  /* _LINUX_RNDIS_H */