summaryrefslogtreecommitdiff
path: root/common/usbx_device_classes/inc/ux_device_class_cdc_ecm.h
blob: 7a8f03cc8d5c89dd9c33d9090885fceb3ec12eb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
/***************************************************************************
 * Copyright (c) 2024 Microsoft Corporation
 * Copyright (c) 2026-present Eclipse ThreadX contributors
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * SPDX-License-Identifier: MIT
 **************************************************************************/

/**************************************************************************/
/**************************************************************************/
/**                                                                       */
/** USBX Component                                                        */
/**                                                                       */
/**   CDC_ECM Class                                                       */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/

/**************************************************************************/
/*                                                                        */
/*  COMPONENT DEFINITION                                   RELEASE        */
/*                                                                        */
/*    ux_device_class_cdc_ecm.h                           PORTABLE C      */
/*                                                           6.3.0        */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Chaoqiong Xiao, Microsoft Corporation                               */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This file defines the equivalences for the USBX Device Class        */
/*    CDC_ECM component.                                                  */
/*                                                                        */
/**************************************************************************/

#ifndef UX_DEVICE_CLASS_CDC_ECM_H
#define UX_DEVICE_CLASS_CDC_ECM_H

/* Determine if a C++ compiler is being used.  If so, ensure that standard
   C is used to process the API information.  */

#ifdef   __cplusplus

/* Yes, C++ compiler is present.  Use standard C.  */
extern   "C" {

#endif

#if !defined(UX_DEVICE_STANDALONE)
#include "nx_api.h"
#include "ux_network_driver.h"
#else

/* Assume NX definitions for compiling.  */
#define NX_PACKET                                               VOID*
/*
UINT  _ux_network_driver_deactivate(VOID *ux_instance, VOID *ux_network_handle);
VOID  _ux_network_driver_link_up(VOID *ux_network_handle);
VOID  _ux_network_driver_link_down(VOID *ux_network_handle);
*/
#ifndef _ux_network_driver_deactivate
#define _ux_network_driver_deactivate(a,b)                      do {} while(0)
#endif
#ifndef _ux_network_driver_link_up
#define _ux_network_driver_link_up(a)                           do {} while(0)
#endif
#ifndef _ux_network_driver_link_down
#define _ux_network_driver_link_down(a)                         do {} while(0)
#endif
#endif


/* Option: defined, it enables zero copy support (works if CDC_ECM owns endpoint buffer).
    Enabled, it requires that the NX packet pool is in cache safe area, and buffer max size is
    larger than UX_DEVICE_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE (1536).
 */
/* #define UX_DEVICE_CLASS_CDC_ECM_ZERO_COPY  */


/* Bulk out endpoint buffer size, must be larger than endpoint and ethernet max packet size, and aligned in 4-bytes.  */
#if (UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1) && defined(UX_DEVICE_CLASS_CDC_ECM_ZERO_COPY)
#define UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE                      0
#else
#define UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE                      UX_DEVICE_CLASS_CDC_ECM_MAX_PACKET_LENGTH
#endif

/* Bulk in endpoint buffer size, must be larger than endpoint and ethernet max packet size, and aligned in 4-bytes.  */
#if (UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1) && defined(UX_DEVICE_CLASS_CDC_ECM_ZERO_COPY)
#define UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE                       0
#else
#define UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE                       UX_DEVICE_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE
#endif

/* Interrupt in endpoint buffer size...  */
#define UX_DEVICE_CLASS_CDC_ECM_INTERRUPTIN_BUFFER_SIZE                  UX_DEVICE_CLASS_CDC_ECM_INTERRUPT_RESPONSE_LENGTH


/* Define generic CDC_ECM equivalences.  */
#define UX_DEVICE_CLASS_CDC_ECM_CLASS_COMMUNICATION_CONTROL                 0x02
#define UX_DEVICE_CLASS_CDC_ECM_SUBCLASS_COMMUNICATION_CONTROL              0x06
#define UX_DEVICE_CLASS_CDC_ECM_CLASS_COMMUNICATION_DATA                    0x0A
#define UX_DEVICE_CLASS_CDC_ECM_NEW_INTERRUPT_EVENT                         0x01
#define UX_DEVICE_CLASS_CDC_ECM_NEW_BULKOUT_EVENT                           0x02
#define UX_DEVICE_CLASS_CDC_ECM_NEW_BULKIN_EVENT                            0x04
#define UX_DEVICE_CLASS_CDC_ECM_NEW_DEVICE_STATE_CHANGE_EVENT               0x08
#define UX_DEVICE_CLASS_CDC_ECM_NETWORK_NOTIFICATION_EVENT                  0x10
#define UX_DEVICE_CLASS_CDC_ECM_INTERRUPT_RESPONSE_LENGTH                   8
#define UX_DEVICE_CLASS_CDC_ECM_MAX_CONTROL_RESPONSE_LENGTH                 256
#define UX_DEVICE_CLASS_CDC_ECM_INTERRUPT_RESPONSE_AVAILABLE_FLAG           1
#define UX_DEVICE_CLASS_CDC_ECM_BASE_IP_ADDRESS                             0xC0A80001
#define UX_DEVICE_CLASS_CDC_ECM_BASE_IP_MASK                                0xFFFFFF00
#define UX_DEVICE_CLASS_CDC_ECM_MAX_MTU                                     1518
#define UX_DEVICE_CLASS_CDC_ECM_ETHERNET_IP                                 0x0800
#define UX_DEVICE_CLASS_CDC_ECM_ETHERNET_ARP                                0x0806
#define UX_DEVICE_CLASS_CDC_ECM_ETHERNET_RARP                               0x8035
#define UX_DEVICE_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE                        1536
#define UX_DEVICE_CLASS_CDC_ECM_NX_ALIGN_PADDING                            2
#ifndef UX_DEVICE_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES
#define UX_DEVICE_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES                           16
#endif

#define UX_DEVICE_CLASS_CDC_ECM_NX_PACKET_SIZE                              sizeof(NX_PACKET)

#define UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT                      UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE, UX_DEVICE_CLASS_CDC_ECM_NX_ALIGN_PADDING), UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_calc_ovf)
#define UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE                             (UX_DEVICE_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE + UX_DEVICE_CLASS_CDC_ECM_NX_ALIGN_PADDING)

#define UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT                         \
    UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT                          \
    UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
        UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE,                            \
        UX_DEVICE_CLASS_CDC_ECM_NX_PACKET_SIZE),                            \
        UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE_calc_ovf)
#define UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE                                (UX_DEVICE_CLASS_CDC_ECM_NX_PAYLOAD_SIZE + UX_DEVICE_CLASS_CDC_ECM_NX_PACKET_SIZE)

#define UX_DEVICE_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_ASSERT           \
    UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT                             \
    UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_MULC_ULONG(                   \
        UX_DEVICE_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES,                          \
        UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE),                              \
        UX_DEVICE_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc1_ovf)       \
    UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
        UX_DEVICE_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES *                         \
            UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE,                           \
        32), UX_DEVICE_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc2_ovf)
#define UX_DEVICE_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE                  (UX_DEVICE_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES * UX_DEVICE_CLASS_CDC_ECM_NX_BUFF_SIZE + 32)

#define UX_DEVICE_CLASS_CDC_ECM_ETHERNET_SIZE                               14
#define UX_DEVICE_CLASS_CDC_ECM_NODE_ID_LENGTH                              6
#define UX_DEVICE_CLASS_CDC_ECM_VENDOR_DESCRIPTION_MAX_LENGTH               64
#define UX_DEVICE_CLASS_CDC_ECM_MAC_OPTIONS                                 8
#define UX_DEVICE_CLASS_CDC_ECM_PACKET_HEADER_MSG                           1

/* Device CDC_ECM Requests */
#define UX_DEVICE_CLASS_CDC_ECM_SEND_ENCAPSULATED_COMMAND                   0x00
#define UX_DEVICE_CLASS_CDC_ECM_GET_ENCAPSULATED_RESPONSE                   0x01
#define UX_DEVICE_CLASS_CDC_ECM_SET_ETHERNET_MULTICAST_FILTER               0x40
#define UX_DEVICE_CLASS_CDC_ECM_SET_ETHERNET_POWER_MANAGEMENT_FILTER        0x41
#define UX_DEVICE_CLASS_CDC_ECM_GET_ETHERNET_POWER_MANAGEMENT_FILTER        0x42
#define UX_DEVICE_CLASS_CDC_ECM_SET_ETHERNET_PACKET_FILTER                  0x43

/* Define CDC_ECM Versions.  Set to 1.0 here.  */
#define UX_DEVICE_CLASS_CDC_ECM_VERSION_MAJOR                               0x00000001
#define UX_DEVICE_CLASS_CDC_ECM_VERSION_MINOR                               0x00000000

/* Define CDC_ECM Connection type supported. Set to connectionless.  */
#define UX_DEVICE_CLASS_CDC_ECM_DF_CONNECTIONLESS                           0x00000001
#define UX_DEVICE_CLASS_CDC_ECM_DF_CONNECTION_ORIENTED                      0x00000002
#define UX_DEVICE_CLASS_CDC_ECM_DF_CONNECTION_SUPPORTED                     UX_DEVICE_CLASS_CDC_ECM_DF_CONNECTIONLESS

/* Define CDC_ECM Medium supported by the device. */
#define UX_DEVICE_CLASS_CDC_ECM_MEDIUM_SUPPORTED                            0x00000000

/* Define CDC_ECM Packet size and types supported.  */
#define UX_DEVICE_CLASS_CDC_ECM_MAX_PACKET_PER_TRANSFER                     0x00000001
#define UX_DEVICE_CLASS_CDC_ECM_MAX_PACKET_TRANSFER_SIZE                    0x00000640
#define UX_DEVICE_CLASS_CDC_ECM_PACKET_ALIGNMENT_FACTOR                     0x00000003
#define UX_DEVICE_CLASS_CDC_ECM_MAX_FRAME_SIZE                              0x000005DC
#define UX_DEVICE_CLASS_CDC_ECM_MAX_PACKET_LENGTH                           0x000005EA

/* Define LINK speeds.  */
#define UX_DEVICE_CLASS_CDC_ECM_LINK_SPEED_FS                               0x0001D4C0

/* Define LINK states.  */
#define UX_DEVICE_CLASS_CDC_ECM_LINK_STATE_DOWN                             0
#define UX_DEVICE_CLASS_CDC_ECM_LINK_STATE_UP                               1
#define UX_DEVICE_CLASS_CDC_ECM_LINK_STATE_PENDING_UP                       2
#define UX_DEVICE_CLASS_CDC_ECM_LINK_STATE_PENDING_DOWN                     3

/* Define media connection values.  */
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_CONNECTED                             0x00000000
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_DISCONNECTED                          0x00000001

/* Define media supported values.  */
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_802_3                                 0x00000000
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_802_5                                 0x00000001
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_FDDI                                  0x00000002
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_WAN                                   0x00000003
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_LOCAL_TALK                            0x00000004
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_DIX                                   0x00000005
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_ARCNET_RAW                            0x00000006
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_ARCNET_878_2                          0x00000007
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_ATM                                   0x00000008
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_WIRELESS_WAN                          0x00000009
#define UX_DEVICE_CLASS_CDC_ECM_MEDIA_IRDA                                  0x0000000A

/* Define CDC_ECM status values.  */
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_SUCCESS                              0x00000000
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_FAILURE                              0xC0000001
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_INVALID_DATA                         0xC0010015
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_NOT_SUPPORTED                        0xC00000BB
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_MEDIA_CONNECTED                      0x4001000B
#define UX_DEVICE_CLASS_CDC_ECM_STATUS_MEDIA_DISCONNECT                     0x4001000C

/* Define CDC_ECM Control Messages values.  */

/* Define CDC_ECM State machine.  */
#define UX_DEVICE_CLASS_CDC_ECM_STATE_UNINITIALIZED                         0x00000000
#define UX_DEVICE_CLASS_CDC_ECM_STATE_INITIALIZED                           0x00000001
#define UX_DEVICE_CLASS_CDC_ECM_STATE_DATA_INITIALIZED                      0x00000002

/* Define NetX errors inside the CDC_ECM class.  */
#define UX_DEVICE_CLASS_CDC_ECM_NX_SUCCESS                                  0x00
#define UX_DEVICE_CLASS_CDC_ECM_NX_NO_PACKET                                0x01
#define UX_DEVICE_CLASS_CDC_ECM_NX_UNDERFLOW                                0x02
#define UX_DEVICE_CLASS_CDC_ECM_NX_OVERFLOW                                 0x03
#define UX_DEVICE_CLASS_CDC_ECM_NX_NO_MAPPING                               0x04
#define UX_DEVICE_CLASS_CDC_ECM_NX_DELETED                                  0x05
#define UX_DEVICE_CLASS_CDC_ECM_NX_POOL_ERROR                               0x06
#define UX_DEVICE_CLASS_CDC_ECM_NX_PTR_ERROR                                0x07
#define UX_DEVICE_CLASS_CDC_ECM_NX_WAIT_ERROR                               0x08
#define UX_DEVICE_CLASS_CDC_ECM_NX_SIZE_ERROR                               0x09
#define UX_DEVICE_CLASS_CDC_ECM_NX_OPTION_ERROR                             0x0a
#define UX_DEVICE_CLASS_CDC_ECM_NX_DELETE_ERROR                             0x10
#define UX_DEVICE_CLASS_CDC_ECM_NX_CALLER_ERROR                             0x11
#define UX_DEVICE_CLASS_CDC_ECM_NX_INVALID_PACKET                           0x12
#define UX_DEVICE_CLASS_CDC_ECM_NX_INVALID_SOCKET                           0x13
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_ENABLED                              0x14
#define UX_DEVICE_CLASS_CDC_ECM_NX_ALREADY_ENABLED                          0x15
#define UX_DEVICE_CLASS_CDC_ECM_NX_ENTRY_NOT_FOUND                          0x16
#define UX_DEVICE_CLASS_CDC_ECM_NX_NO_MORE_ENTRIES                          0x17
#define UX_DEVICE_CLASS_CDC_ECM_NX_ARP_TIMER_ERROR                          0x18
#define UX_DEVICE_CLASS_CDC_ECM_NX_RESERVED_CODE0                           0x19
#define UX_DEVICE_CLASS_CDC_ECM_NX_WAIT_ABORTED                             0x1A
#define UX_DEVICE_CLASS_CDC_ECM_NX_IP_INTERNAL_ERROR                        0x20
#define UX_DEVICE_CLASS_CDC_ECM_NX_IP_ADDRESS_ERROR                         0x21
#define UX_DEVICE_CLASS_CDC_ECM_NX_ALREADY_BOUND                            0x22
#define UX_DEVICE_CLASS_CDC_ECM_NX_PORT_UNAVAILABLE                         0x23
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_BOUND                                0x24
#define UX_DEVICE_CLASS_CDC_ECM_NX_RESERVED_CODE1                           0x25
#define UX_DEVICE_CLASS_CDC_ECM_NX_SOCKET_UNBOUND                           0x26
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_CREATED                              0x27
#define UX_DEVICE_CLASS_CDC_ECM_NX_SOCKETS_BOUND                            0x28
#define UX_DEVICE_CLASS_CDC_ECM_NX_NO_RESPONSE                              0x29
#define UX_DEVICE_CLASS_CDC_ECM_NX_POOL_DELETED                             0x30
#define UX_DEVICE_CLASS_CDC_ECM_NX_ALREADY_RELEASED                         0x31
#define UX_DEVICE_CLASS_CDC_ECM_NX_RESERVED_CODE2                           0x32
#define UX_DEVICE_CLASS_CDC_ECM_NX_MAX_LISTEN                               0x33
#define UX_DEVICE_CLASS_CDC_ECM_NX_DUPLICATE_LISTEN                         0x34
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_CLOSED                               0x35
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_LISTEN_STATE                         0x36
#define UX_DEVICE_CLASS_CDC_ECM_NX_IN_PROGRESS                              0x37
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_CONNECTED                            0x38
#define UX_DEVICE_CLASS_CDC_ECM_NX_WINDOW_OVERFLOW                          0x39
#define UX_DEVICE_CLASS_CDC_ECM_NX_ALREADY_SUSPENDED                        0x40
#define UX_DEVICE_CLASS_CDC_ECM_NX_DISCONNECT_FAILED                        0x41
#define UX_DEVICE_CLASS_CDC_ECM_NX_STILL_BOUND                              0x42
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_SUCCESSFUL                           0x43
#define UX_DEVICE_CLASS_CDC_ECM_NX_UNHANDLED_COMMAND                        0x44
#define UX_DEVICE_CLASS_CDC_ECM_NX_NO_FREE_PORTS                            0x45
#define UX_DEVICE_CLASS_CDC_ECM_NX_INVALID_PORT                             0x46
#define UX_DEVICE_CLASS_CDC_ECM_NX_INVALID_RELISTEN                         0x47
#define UX_DEVICE_CLASS_CDC_ECM_NX_CONNECTION_PENDING                       0x48
#define UX_DEVICE_CLASS_CDC_ECM_NX_TX_QUEUE_DEPTH                           0x49
#define UX_DEVICE_CLASS_CDC_ECM_NX_NOT_IMPLEMENTED                          0x80

/* Define timeout packet allocation value.  */
#ifndef UX_DEVICE_CLASS_CDC_ECM_PACKET_POOL_WAIT
#define UX_DEVICE_CLASS_CDC_ECM_PACKET_POOL_WAIT                            1000
#endif

#ifndef UX_DEVICE_CLASS_CDC_ECM_PACKET_POOL_INST_WAIT
#define UX_DEVICE_CLASS_CDC_ECM_PACKET_POOL_INST_WAIT                       1000
#endif

#define UX_DEVICE_CLASS_CDC_ECM_LINK_CHECK_WAIT                             10

/* Define Slave CDC_ECM Class Calling Parameter structure */

typedef struct UX_SLAVE_CLASS_CDC_ECM_PARAMETER_STRUCT
{
    VOID                    (*ux_slave_class_cdc_ecm_instance_activate)(VOID *);
    VOID                    (*ux_slave_class_cdc_ecm_instance_deactivate)(VOID *);
    ULONG                   ux_slave_class_cdc_ecm_parameter_media;
    ULONG                   ux_slave_class_cdc_ecm_parameter_vendor_id;
    ULONG                   ux_slave_class_cdc_ecm_parameter_driver_version;
    UCHAR                   ux_slave_class_cdc_ecm_parameter_vendor_description[UX_DEVICE_CLASS_CDC_ECM_VENDOR_DESCRIPTION_MAX_LENGTH];
    UCHAR                   ux_slave_class_cdc_ecm_parameter_local_node_id[UX_DEVICE_CLASS_CDC_ECM_NODE_ID_LENGTH];
    UCHAR                   ux_slave_class_cdc_ecm_parameter_remote_node_id[UX_DEVICE_CLASS_CDC_ECM_NODE_ID_LENGTH];
} UX_SLAVE_CLASS_CDC_ECM_PARAMETER;

/* Define CDC_ECM Class structure.  */

typedef struct UX_SLAVE_CLASS_CDC_ECM_STRUCT
{
    UX_SLAVE_INTERFACE                      *ux_slave_class_cdc_ecm_interface;
    UX_SLAVE_CLASS_CDC_ECM_PARAMETER        ux_slave_class_cdc_ecm_parameter;
    UX_SLAVE_ENDPOINT                       *ux_slave_class_cdc_ecm_bulkin_endpoint;
    UX_SLAVE_ENDPOINT                       *ux_slave_class_cdc_ecm_bulkout_endpoint;
    UX_SLAVE_ENDPOINT                       *ux_slave_class_cdc_ecm_interrupt_endpoint;
#if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
    UCHAR                                   *ux_device_class_cdc_ecm_endpoint_buffer;
#endif
    ULONG                                   ux_slave_class_cdc_ecm_state;
    ULONG                                   ux_slave_class_cdc_ecm_current_alternate_setting;
    ULONG                                   ux_slave_class_cdc_ecm_max_transfer_size;
    ULONG                                   ux_slave_class_cdc_ecm_request_id;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_xmit_ok;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_rcv_ok;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_xmit_error;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_rcv_error;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_rcv_no_buffer;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_rcv_error_alignment;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_xmit_one_collision;
    ULONG                                   ux_slave_class_cdc_ecm_statistics_xmit_more_collisions;
    ULONG                                   ux_slave_class_cdc_ecm_ethernet_multicast_filter;
    ULONG                                   ux_slave_class_cdc_ecm_ethernet_power_management_filter;
    ULONG                                   ux_slave_class_cdc_ecm_ethernet_packet_filter;
    UCHAR                                   ux_slave_class_cdc_ecm_local_node_id[UX_DEVICE_CLASS_CDC_ECM_NODE_ID_LENGTH];
    UCHAR                                   ux_slave_class_cdc_ecm_remote_node_id[UX_DEVICE_CLASS_CDC_ECM_NODE_ID_LENGTH];
    ULONG                                   ux_slave_class_cdc_ecm_nx_ip_address;
    ULONG                                   ux_slave_class_cdc_ecm_nx_ip_network_mask;

#if !defined(UX_DEVICE_STANDALONE)
    NX_IP                                   *ux_slave_class_cdc_ecm_nx_ip;
    NX_INTERFACE                            *ux_slave_class_cdc_ecm_nx_interface;
    NX_PACKET                               *ux_slave_class_cdc_ecm_xmit_queue;
    NX_PACKET                               *ux_slave_class_cdc_ecm_xmit_queue_tail;
    NX_PACKET                               *ux_slave_class_cdc_ecm_receive_queue;
    NX_PACKET_POOL                          *ux_slave_class_cdc_ecm_packet_pool;
#endif

#if !defined(UX_DEVICE_STANDALONE)
    UX_EVENT_FLAGS_GROUP                    ux_slave_class_cdc_ecm_event_flags_group;
    UX_THREAD                               ux_slave_class_cdc_ecm_bulkin_thread;
    UX_THREAD                               ux_slave_class_cdc_ecm_bulkout_thread;
    UX_THREAD                               ux_slave_class_cdc_ecm_interrupt_thread;
    UX_MUTEX                                ux_slave_class_cdc_ecm_mutex;
    UCHAR                                   *ux_slave_class_cdc_ecm_bulkin_thread_stack;
    UCHAR                                   *ux_slave_class_cdc_ecm_bulkout_thread_stack;
    UCHAR                                   *ux_slave_class_cdc_ecm_interrupt_thread_stack;
#endif

    ULONG                                   ux_slave_class_cdc_ecm_link_state;
    VOID                                    *ux_slave_class_cdc_ecm_network_handle;

} UX_SLAVE_CLASS_CDC_ECM;

/* Define CDC ECM endpoint buffer settings (when CDC ECM owns buffer).  */
#if defined(UX_DEVICE_CLASS_CDC_ECM_ZERO_COPY)
#define UX_DEVICE_CLASS_CDC_ECM_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW 0 /* No calculation, no overflow  */
#else
#define UX_DEVICE_CLASS_CDC_ECM_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW \
    (UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE,   \
                                 UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE) || \
     UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE +  \
                                 UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE,    \
                                 UX_DEVICE_CLASS_CDC_ECM_INTERRUPTIN_BUFFER_SIZE))
#endif
#define UX_DEVICE_CLASS_CDC_ECM_ENDPOINT_BUFFER_SIZE        (UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE + UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE + UX_DEVICE_CLASS_CDC_ECM_INTERRUPTIN_BUFFER_SIZE)
#define UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER(ecm)         ((ecm)->ux_device_class_cdc_ecm_endpoint_buffer)
#define UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER(ecm)          (UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER(ecm) + UX_DEVICE_CLASS_CDC_ECM_BULKOUT_BUFFER_SIZE)
#define UX_DEVICE_CLASS_CDC_ECM_INTERRUPTIN_BUFFER(ecm)     (UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER(ecm)  + UX_DEVICE_CLASS_CDC_ECM_BULKIN_BUFFER_SIZE)


/* Requests - Ethernet Networking Control Model */

#define UX_DEVICE_CLASS_CDC_ECM_SEND_ENCAPSULATED_COMMAND                        0x00
                                        /* Issues a command in the format of the supported control
                                           protocol. The intent of this mechanism is to support
                                           networking devices (e.g., host-based cable modems)
                                           that require an additional vendor-defined interface for
                                           media specific hardware configuration and
                                           management.  */
#define UX_DEVICE_CLASS_CDC_ECM_GET_ENCAPSULATED_RESPONSE                        0x01
                                        /* Requests a response in the format of the supported
                                           control protocol.  */


/* Define buffer length for IN/OUT pipes.  */

#define UX_DEVICE_CLASS_CDC_ECM_BUFFER_SIZE                  4096


/* Define Device CDC_ECM Class prototypes.  */

UINT  _ux_device_class_cdc_ecm_activate(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_control_request(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_deactivate(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_change(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_entry(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_initialize(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
UINT  _ux_device_class_cdc_ecm_write(VOID *cdc_ecm_class, NX_PACKET *packet);
VOID  _ux_device_class_cdc_ecm_bulkin_thread(ULONG cdc_ecm_class);
VOID  _ux_device_class_cdc_ecm_bulkout_thread(ULONG cdc_ecm_class);
VOID  _ux_device_class_cdc_ecm_interrupt_thread(ULONG cdc_ecm_class);


/* Define Device CDC Class API prototypes.  */

#define ux_device_class_cdc_ecm_entry    _ux_device_class_cdc_ecm_entry
#define ux_device_class_cdc_ecm_read     _ux_device_class_cdc_ecm_read
#define ux_device_class_cdc_ecm_write    _ux_device_class_cdc_ecm_write

/* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.  */
#ifdef __cplusplus
}
#endif

#endif /* UX_DEVICE_CLASS_CDC_ECM_H */