2 * Copyright (c) 1999 - 2003
3 * NetGroup, Politecnico di Torino (Italy)
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the Politecnico di Torino nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #pragma VxD_LOCKED_CODE_SEG
41 #pragma VxD_LOCKED_DATA_SEG
44 void YieldExecution( void )
46 VMMCall(Release_Time_Slice
);
47 VMMCall(Begin_Nest_Exec
);
49 VMMCall(End_Nest_Exec
);
52 /************************************************************
53 Function called when the user level application performs a open
54 IOCTL. Opens the adapter.
55 ************************************************************/
57 static NDIS_MEDIUM MediumArray
[] = {
61 NdisMediumArcnet878_2
,
65 #define NUM_NDIS_MEDIA (sizeof MediumArray / sizeof MediumArray[0])
67 DWORD
PacketOpen(PNDIS_STRING AdapterName
,DWORD dwDDB
,DWORD hDevice
,PDIOCPARAMETERS pDiocParms
)
70 LARGE_INTEGER SystemTime
;
72 PDEVICE_EXTENSION pde
;
74 NDIS_STATUS nsErrorStatus
, nsOpenStatus
;
81 pde
= GlobalDeviceExtension
;
82 /*Allocate an element that describe an adapter*/
83 NdisAllocateMemory( (PVOID
*)&oiNew
, sizeof( OPEN_INSTANCE
), 0, -1 );
86 return NDIS_STATUS_FAILURE
;
88 NdisZeroMemory( (PVOID
)oiNew
, sizeof( OPEN_INSTANCE
) );
89 /*allocate a pool for the packet headers*/
91 NdisAllocatePacketPool( &nsErrorStatus
,
94 sizeof(PACKET_RESERVED
) );
96 IF_TRACE_MSG( "PACKET_RESERVED_a :%lx",sizeof(PACKET_RESERVED
));
97 if ( nsErrorStatus
!= NDIS_STATUS_SUCCESS
)
99 IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus
);
100 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
101 TRACE_LEAVE( "BindAdapter" );
102 return NDIS_STATUS_FAILURE
;
106 /*allocate a buffer pool for the packet data*/
107 NdisAllocateBufferPool( &nsErrorStatus
,
108 &(oiNew
->BufferPool
),
110 if ( nsErrorStatus
!= NDIS_STATUS_SUCCESS
)
112 IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus
);
113 NdisFreePacketPool( oiNew
->PacketPool
);
114 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
115 TRACE_LEAVE( "BindAdapter" );
116 return NDIS_STATUS_FAILURE
;
118 NdisAllocateSpinLock( &(oiNew
->ResetSpinLock
) );
119 InitializeListHead( &(oiNew
->ResetIrpList
) );
120 NdisAllocateSpinLock( &(oiNew
->RcvQSpinLock
) );
121 InitializeListHead( &(oiNew
->RcvList
) );
122 NdisAllocateSpinLock( &(oiNew
->RequestSpinLock
) );
123 InitializeListHead( &(oiNew
->RequestList
) );
125 for ( i
=0;i
<MAX_REQUESTS
;i
++ )
127 InsertTailList( &(oiNew
->RequestList
), &(oiNew
->Requests
[i
].Reserved
.ListElement
) );
130 oiNew
->Status
= NDIS_STATUS_PENDING
;
132 /*initialize the timer variables for this session*/
134 SystemTime
=GetDate();
136 ltime1
=((__int64
)SystemTime
.HighPart
*86400);
137 ltime1
+=(__int64
)(SystemTime
.LowPart
/1000); //current time from 1980 in seconds
138 ltime1
+=(__int64
)315532800; //current time from 1970 (Unix format) in seconds
140 ltime1
+=(SystemTime
.LowPart
%1000)*1193182/1000; //current time from 1970 in ticks
141 ltime1
-=QuerySystemTime(); //boot time from 1970 in ticks
142 oiNew
->StartTime
=ltime1
;
145 oiNew
->Dropped
=0; //reset the dropped packets counter
146 oiNew
->Received
=0; //reset the received packets counter
147 oiNew
->bpfprogram
=NULL
; //set an accept-all filter
148 oiNew
->bpfprogramlen
=0;
149 oiNew
->BufSize
=0; //set an empty buffer
150 oiNew
->Buffer
=NULL
; //reset the buffer
154 oiNew
->TimeOut
=0; //reset the timeouts
155 oiNew
->ReadTimeoutTimer
=0;
156 oiNew
->mode
=0; //set capture mode
157 oiNew
->Nbytes
=0; //reset the counters
159 oiNew
->hDevice
=hDevice
;
160 oiNew
->tagProcess
=pDiocParms
->tagProcess
;
161 oiNew
->ReadEvent
=0; //reset the read event
163 NdisAllocateSpinLock( &(oiNew
->CountersLock
) );
164 /*open the MAC driver calling NDIS*/
165 NdisOpenAdapter( &nsOpenStatus
,
167 &oiNew
->AdapterHandle
,
171 pde
->NdisProtocolHandle
,
177 IF_TRACE_MSG( "Open Status : %lx", nsOpenStatus
);
178 IF_TRACE_MSG( "Error Status : %lx", nsErrorStatus
);
179 IF_TRACE_MSG( "Completion Status : %lx", oiNew
->Status
);
181 if ( nsOpenStatus
== NDIS_STATUS_PENDING
)
183 while ( oiNew
->Status
== NDIS_STATUS_PENDING
)
188 PacketOpenAdapterComplete( oiNew
, nsOpenStatus
, nsErrorStatus
);
191 Status
= oiNew
->Status
;
192 if ( Status
!= NDIS_STATUS_SUCCESS
)
194 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
195 return NDIS_STATUS_FAILURE
;
202 TRACE_LEAVE( "BindAdapter" );
204 /*return succesfully*/
205 return STATUS_SUCCESS
;
209 /************************************************************
210 Function called when the user level application performs a Close
211 IOCTL. Closes the adapter and free the reources associated with it
212 ************************************************************/
214 DWORD
PacketClose(POPEN_INSTANCE Open
,DWORD dwDDB
,DWORD hDevice
,PDIOCPARAMETERS pDiocParms
)
218 NDIS_STATUS nsErrorStatus
;
222 TRACE_ENTER( "PacketClose" );
226 to
=Open
->ReadTimeoutTimer
;
227 Open
->ReadTimeoutTimer
=0;
235 // Free the read event
236 TEvent
=Open
->ReadEvent
;
238 VxDCall(_VWIN32_CloseVxDHandle
);
241 NdisCloseAdapter(&nsErrorStatus
,Open
->AdapterHandle
);
242 if ( nsErrorStatus
== NDIS_STATUS_PENDING
)
244 while ( Open
->Status
== NDIS_STATUS_PENDING
)
247 if(Open
->Status
!=NDIS_STATUS_SUCCESS
){
248 TRACE_LEAVE( "PacketClose" );
249 return NDIS_STATUS_FAILURE
;
254 PacketUnbindAdapterComplete( Open
, nsErrorStatus
);
255 if(nsErrorStatus
!=NDIS_STATUS_SUCCESS
){
256 TRACE_LEAVE( "PacketClose" );
257 return NDIS_STATUS_FAILURE
;
261 Status
= Open
->Status
;
263 if(Open
->Buffer
!=NULL
)NdisFreeMemory(Open
->Buffer
,Open
->BufSize
,0);
265 if(Open
->bpfprogram
!=NULL
)NdisFreeMemory(Open
->bpfprogram
,Open
->bpfprogramlen
,0);
267 //remove this adapter from the list of open adapters
268 NdisAcquireSpinLock( &GlobalDeviceExtension
->OpenSpinLock
);
269 RemoveEntryList(&(Open
->ListElement
));
270 NdisReleaseSpinLock( &GlobalDeviceExtension
->OpenSpinLock
);
272 NdisFreeMemory( Open
, sizeof( OPEN_INSTANCE
) , 0 );
275 *(DWORD
*)(pDiocParms
->lpcbBytesReturned
) = 0;
277 TRACE_LEAVE( "PacketClose" );
282 /************************************************************
283 Function used by NDIS to update the VXD when a new MAC driver
285 ************************************************************/
286 VOID NDIS_API
PacketBindAdapter( OUT PNDIS_STATUS Status
,
287 IN NDIS_HANDLE BindAdapterContext
,
288 IN PNDIS_STRING AdapterName
,
289 IN PVOID SystemSpecific1
,
290 IN PVOID SystemSpecific2
)
292 PDEVICE_EXTENSION pde
;
293 POPEN_INSTANCE oiNew
;
294 NDIS_STATUS nsErrorStatus
, nsOpenStatus
;
297 PWRAPPER_PROTOCOL_BLOCK pWPBlock
;
298 PNDIS_PROTOCOL_CHARACTERISTICS pNPChar
;
300 PWRAPPER_MAC_BLOCK pWMBlock
;
301 PNDIS_MAC_CHARACTERISTICS pNMChar
;
305 TRACE_ENTER( "BindAdapter" );
306 pde
= GlobalDeviceExtension
;
307 /*Allocate an element that describe an adapter*/
308 NdisAllocateMemory( (PVOID
*)&AName
, sizeof(ADAPTER_NAME
), 0, -1 );
311 *Status
= NDIS_STATUS_RESOURCES
;
315 NdisAllocateMemory( (PVOID
*)&oiNew
, sizeof( OPEN_INSTANCE
), 0, -1 );
318 *Status
= NDIS_STATUS_RESOURCES
;
321 NdisZeroMemory( (PVOID
)oiNew
, sizeof( OPEN_INSTANCE
) );
323 /*Save Binding Context*/
324 oiNew
->BindAdapterContext
= BindAdapterContext
;
326 /*Save the device handle*/
328 oiNew
->hDevice
= (DWORD
) SystemSpecific1
;
330 /*allocate a pool for the packet headers*/
332 NdisAllocatePacketPool( &nsErrorStatus
,
333 &(oiNew
->PacketPool
),
335 sizeof(PACKET_RESERVED
) );
337 IF_TRACE_MSG( "PACKET_RESERVED_b :%lx",sizeof(PACKET_RESERVED
));
338 if ( nsErrorStatus
!= NDIS_STATUS_SUCCESS
)
340 IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus
);
341 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
342 *Status
= NDIS_STATUS_RESOURCES
;
343 TRACE_LEAVE( "BindAdapter" );
348 /*allocate a pool for the packet data*/
350 NdisAllocateBufferPool( &nsErrorStatus
,
351 &(oiNew
->BufferPool
),
353 if ( nsErrorStatus
!= NDIS_STATUS_SUCCESS
)
355 IF_TRACE_MSG( "Failed to allocate packet pool AllocStatus=%x", nsErrorStatus
);
356 NdisFreePacketPool( oiNew
->PacketPool
);
357 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
358 *Status
= NDIS_STATUS_RESOURCES
;
359 TRACE_LEAVE( "BindAdapter" );
362 NdisAllocateSpinLock( &(oiNew
->ResetSpinLock
) );
363 InitializeListHead( &(oiNew
->ResetIrpList
) );
364 NdisAllocateSpinLock( &(oiNew
->RcvQSpinLock
) );
365 InitializeListHead( &(oiNew
->RcvList
) );
366 NdisAllocateSpinLock( &(oiNew
->RequestSpinLock
) );
367 InitializeListHead( &(oiNew
->RequestList
) );
369 for ( i
=0;i
<MAX_REQUESTS
;i
++ )
371 InsertTailList( &(oiNew
->RequestList
), &(oiNew
->Requests
[i
].Reserved
.ListElement
) );
373 oiNew
->Status
= NDIS_STATUS_PENDING
;
374 oiNew
->BindAdapterContext
= BindAdapterContext
;
376 /*open the MAC driver calling NDIS*/
381 NdisOpenAdapter( &nsOpenStatus
,
383 &oiNew
->AdapterHandle
,
387 pde
->NdisProtocolHandle
,
392 IF_TRACE_MSG( "Open Status : %lx", nsOpenStatus
);
393 IF_TRACE_MSG( "Error Status : %lx", nsErrorStatus
);
394 IF_TRACE_MSG( "Completion Status : %lx", oiNew
->Status
);
395 if ( nsOpenStatus
== NDIS_STATUS_PENDING
)
397 while ( oiNew
->Status
== NDIS_STATUS_PENDING
)
402 PacketOpenAdapterComplete( oiNew
, nsOpenStatus
, nsErrorStatus
);
405 pWPBlock
= ((PWRAPPER_OPEN_BLOCK
)(oiNew
->AdapterHandle
))->ProtocolHandle
;
406 pNPChar
= &pWPBlock
->ProtocolCharacteristics
;
407 IF_TRACE_MSG( "Protocol : %s", pNPChar
->Name
.Buffer
);
408 IF_TRACE_MSG( "Protocol Handle : %lx", pde
->NdisProtocolHandle
);
409 IF_TRACE_MSG( "PWRAPPER_OPEN_BLOCK : %lx", oiNew
->AdapterHandle
);
410 IF_TRACE_MSG( "PWRAPPER_PROTOCOL_BLOCK : %lx", pWPBlock
);
411 IF_TRACE_MSG( "NDIS_PROTOCOL_CHARACTERISTICS : %lx", pNPChar
);
412 IF_TRACE_MSG( "Name : %lx", &pNPChar
->Name
);
413 IF_TRACE_MSG( "Adapter Name : %s", AdapterName
->Buffer
);
414 *Status
= oiNew
->Status
;
416 if ( *Status
!= NDIS_STATUS_SUCCESS
)
418 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
419 IF_TRACE( "Bind Operation FAILED!" );
423 AName
->realnamestr
.Length
=AdapterName
->Length
;
424 AName
->realnamestr
.MaximumLength
=AdapterName
->MaximumLength
;
425 AName
->realnamestr
.Buffer
=AName
->realname
;
426 for(i
=0;i
<32;i
++)AName
->realname
[i
]=AdapterName
->Buffer
[i
];
428 pWMBlock
= ((PWRAPPER_OPEN_BLOCK
)(oiNew
->AdapterHandle
))->MacHandle
;
429 pNMChar
= &pWMBlock
->MacCharacteristics
;
430 lpzName
= pNMChar
->Name
.Buffer
;
431 for(i
=0;i
<32;i
++)AName
->devicename
[i
]=lpzName
[i
];
432 InsertTailList( &GlobalDeviceExtension
->AdapterNames
, &AName
->ListElement
);
435 NdisCloseAdapter(&nsErrorStatus
,oiNew
->AdapterHandle
);
437 if ( nsErrorStatus
== NDIS_STATUS_PENDING
)
439 while ( oiNew
->Status
== NDIS_STATUS_PENDING
)
444 PacketUnbindAdapterComplete( oiNew
, nsErrorStatus
);
446 *Status
= oiNew
->Status
;
447 if ( *Status
== NDIS_STATUS_SUCCESS
)
449 //remove this adapter from the list of open adapters
450 RemoveEntryList(&(oiNew
->ListElement
));
452 NdisFreeMemory( oiNew
, sizeof( OPEN_INSTANCE
) , 0 );
456 IF_TRACE( "Close Operation FAILED!" );
461 TRACE_LEAVE( "BindAdapter" );
465 /************************************************************
466 Function called by NDIS to indicate the completion of a bind
467 ************************************************************/
469 PacketOpenAdapterComplete(
470 IN NDIS_HANDLE ProtocolBindingContext
,
471 IN NDIS_STATUS Status
,
472 IN NDIS_STATUS OpenErrorStatus
)
476 TRACE_ENTER( "BindAdapterComplete" );
477 IF_TRACE_MSG2( "ErrorStatus=%x Status=%x", OpenErrorStatus
, Status
);
478 Open
= (POPEN_INSTANCE
)ProtocolBindingContext
;
479 if ( Status
== NDIS_STATUS_SUCCESS
)
481 /*Insert the just opened NIC in the list of initialized NICs*/
482 NdisAcquireSpinLock( &GlobalDeviceExtension
->OpenSpinLock
);
483 InsertHeadList( &GlobalDeviceExtension
->OpenList
, &Open
->ListElement
);
484 NdisReleaseSpinLock( &GlobalDeviceExtension
->OpenSpinLock
);
489 PacketFreeResources( Open
);
492 Open
->Status
= Status
;
493 /*complete the binding*/
494 NdisCompleteBindAdapter( Open
->BindAdapterContext
, Status
, OpenErrorStatus
);
495 TRACE_LEAVE( "BindAdapterComplete" );
499 /************************************************************
500 Start the unbind of a network driver from the protocol driver
501 ************************************************************/
503 PacketUnbindAdapter( OUT PNDIS_STATUS Status
,
504 IN NDIS_HANDLE ProtocolBindingContext
,
505 IN NDIS_HANDLE UnbindContext
)
508 NDIS_STATUS nsCloseStatus
;
510 TRACE_ENTER( "UnbindAdapter" );
513 Open
= (POPEN_INSTANCE
)ProtocolBindingContext
;
514 Open
->BindAdapterContext
= UnbindContext
;
515 /*clean the pending requests*/
516 PacketCleanUp( Status
, Open
);
517 Open
->Status
= NDIS_STATUS_PENDING
;
518 /*Calls NDIS to close the selected adapter*/
520 NdisCloseAdapter( &nsCloseStatus
, Open
->AdapterHandle
);
521 if ( nsCloseStatus
== NDIS_STATUS_PENDING
)
523 while ( Open
->Status
== NDIS_STATUS_PENDING
)
528 PacketUnbindAdapterComplete( Open
, nsCloseStatus
);
530 *Status
= Open
->Status
;
531 if ( *Status
== NDIS_STATUS_SUCCESS
)
533 NdisFreeMemory( Open
, sizeof( OPEN_INSTANCE
) , 0 );
537 IF_TRACE( "Unbind Operation FAILED!" );
539 TRACE_LEAVE( "CloseAdapter" );
544 /************************************************************
545 Complete the unbind of a network driver from the protocol driver
546 ************************************************************/
548 PacketUnbindAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext
,
549 IN NDIS_STATUS Status
)
553 TRACE_ENTER( "UnbindAdapterComplete" );
554 Open
= (POPEN_INSTANCE
)ProtocolBindingContext
;
555 if ( Status
== NDIS_STATUS_SUCCESS
)
557 PacketFreeResources( Open
);
559 Open
->Status
= Status
;
561 TRACE_LEAVE( "UnbindAdapterComplete" );
565 /************************************************************
566 free the resources allocated by an adapter
567 ************************************************************/
568 VOID
PacketFreeResources( POPEN_INSTANCE Open
)
570 NdisFreeSpinLock( &Open
->RequestSpinLock
);
571 NdisFreeSpinLock( &Open
->RcvQSpinLock
);
572 NdisFreeSpinLock( &Open
->ResetSpinLock
);
573 NdisFreeBufferPool( Open
->BufferPool
);
574 NdisFreePacketPool( Open
->PacketPool
);
577 /************************************************************
578 Function that frees the pending requests
579 ************************************************************/
581 PacketCleanUp( PNDIS_STATUS Status
,
582 POPEN_INSTANCE Open
)
584 PLIST_ENTRY PacketListEntry
;
585 PNDIS_PACKET pPacket
;
586 PPACKET_RESERVED Reserved
;
588 TRACE_ENTER( "Cleanup" );
589 /*clean all the pending requests*/
590 NdisAcquireSpinLock( &(Open
->RcvQSpinLock
) );
591 while( (PacketListEntry
= PacketRemoveHeadList( &(Open
->RcvList
) )) != NULL
)
593 IF_VERY_LOUD( "CleanUp - Completing read" );
594 Reserved
= CONTAINING_RECORD( PacketListEntry
, PACKET_RESERVED
, ListElement
);
595 pPacket
= CONTAINING_RECORD( Reserved
, NDIS_PACKET
, ProtocolReserved
);
596 /*emulate the end of a transfer to wake the processes that
597 are waiting on a request */
598 PacketTransferDataComplete( Open
, pPacket
, NDIS_STATUS_SUCCESS
, 0 );
600 NdisReleaseSpinLock( &(Open
->RcvQSpinLock
) );
601 TRACE_LEAVE( "Cleanup" );
605 /************************************************************
606 Start the reset of a instance of the driver
607 ************************************************************/
609 PacketReset( PNDIS_STATUS pStatus
,
610 POPEN_INSTANCE pOpen
)
612 PLIST_ENTRY ResetListEntry
;
614 TRACE_ENTER( "PacketReset" );
616 NdisAcquireSpinLock( &pOpen
->RequestSpinLock
);
617 ResetListEntry
= PacketRemoveHeadList( &pOpen
->RequestList
);
618 NdisReleaseSpinLock( &pOpen
->RequestSpinLock
);
619 if ( ResetListEntry
== NULL
)
621 *pStatus
= NDIS_STATUS_RESOURCES
;
622 TRACE_LEAVE( "PacketReset" );
625 NdisAcquireSpinLock( &pOpen
->ResetSpinLock
);
626 InsertTailList( &pOpen
->ResetIrpList
, ResetListEntry
);
627 NdisReleaseSpinLock( &pOpen
->ResetSpinLock
);
629 /*Call NDIS to reset the adapter*/
630 NdisReset( pStatus
, pOpen
->AdapterHandle
);
631 if ( *pStatus
!= NDIS_STATUS_PENDING
)
633 /*synchronous reset of the adapter*/
634 PacketResetComplete( pOpen
, *pStatus
);
636 TRACE_LEAVE( "PacketReset" );
640 /************************************************************
641 complete the reset of a instance of the driver
642 ************************************************************/
644 PacketResetComplete( IN NDIS_HANDLE ProtocolBindingContext
,
645 IN NDIS_STATUS Status
)
648 PLIST_ENTRY ResetListEntry
;
650 TRACE_ENTER( "PacketResetComplete" );
651 Open
= (POPEN_INSTANCE
)ProtocolBindingContext
;
653 NdisAcquireSpinLock( &Open
->ResetSpinLock
);
654 ResetListEntry
= PacketRemoveHeadList( &Open
->ResetIrpList
);
655 NdisReleaseSpinLock( &Open
->ResetSpinLock
);
656 if ( ResetListEntry
== NULL
)
658 IF_VERY_LOUD( "Reset List Empty Error" );
659 TRACE_LEAVE( "PacketResetComplete" );
663 NdisAcquireSpinLock( &Open
->RequestSpinLock
);
664 InsertTailList( &Open
->RequestList
, ResetListEntry
);
665 NdisReleaseSpinLock( &Open
->RequestSpinLock
);
666 TRACE_LEAVE( "PacketResetComplete" );