2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Novell Eagle 2000 driver
5 * PURPOSE: Driver entry point
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 27/08-2000 Created
15 /* See debug.h for debug/trace constants */
16 ULONG DebugTraceLevel
= MIN_TRACE
;
21 /* List of supported OIDs */
22 static ULONG MiniportOIDList
[] = {
23 OID_GEN_SUPPORTED_LIST
,
24 OID_GEN_HARDWARE_STATUS
,
25 OID_GEN_MEDIA_SUPPORTED
,
27 OID_GEN_MAXIMUM_LOOKAHEAD
,
28 OID_GEN_MAXIMUM_FRAME_SIZE
,
30 OID_GEN_TRANSMIT_BUFFER_SPACE
,
31 OID_GEN_RECEIVE_BUFFER_SPACE
,
32 OID_GEN_TRANSMIT_BLOCK_SIZE
,
33 OID_GEN_RECEIVE_BLOCK_SIZE
,
35 OID_GEN_VENDOR_DESCRIPTION
,
36 OID_GEN_VENDOR_DRIVER_VERSION
,
37 OID_GEN_CURRENT_PACKET_FILTER
,
38 OID_GEN_CURRENT_LOOKAHEAD
,
39 OID_GEN_DRIVER_VERSION
,
40 OID_GEN_MAXIMUM_TOTAL_SIZE
,
41 OID_GEN_PROTOCOL_OPTIONS
,
43 OID_GEN_MEDIA_CONNECT_STATUS
,
44 OID_GEN_MAXIMUM_SEND_PACKETS
,
45 OID_802_3_PERMANENT_ADDRESS
,
46 OID_802_3_CURRENT_ADDRESS
,
47 OID_802_3_MULTICAST_LIST
,
48 OID_802_3_MAXIMUM_LIST_SIZE
,
52 DRIVER_INFORMATION DriverInfo
= {0};
53 NDIS_PHYSICAL_ADDRESS HighestAcceptableMax
= NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
56 BOOLEAN
MiniportCheckForHang(
57 IN NDIS_HANDLE MiniportAdapterContext
)
59 * FUNCTION: Examines if an adapter has hung
61 * MiniportAdapterContext = Pointer to adapter context area
63 * TRUE if the adapter has hung, FALSE if not
66 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
72 VOID
MiniportDisableInterrupt(
73 IN NDIS_HANDLE MiniportAdapterContext
)
75 * FUNCTION: Disables interrupts from an adapter
77 * MiniportAdapterContext = Pointer to adapter context area
80 NDIS_DbgPrint(MAX_TRACE
, ("Called. (MiniportDisableInterrupt).\n"));
82 NICDisableInterrupts((PNIC_ADAPTER
)MiniportAdapterContext
);
87 VOID
MiniportEnableInterrupt(
88 IN NDIS_HANDLE MiniportAdapterContext
)
90 * FUNCTION: Enables interrupts from an adapter
92 * MiniportAdapterContext = Pointer to adapter context area
95 NDIS_DbgPrint(MAX_TRACE
, ("Called. (MiniportEnableInterrupt).\n"));
97 NICEnableInterrupts((PNIC_ADAPTER
)MiniportAdapterContext
);
103 IN NDIS_HANDLE MiniportAdapterContext
)
105 * FUNCTION: Deallocates resources for and halts an adapter
107 * MiniportAdapterContext = Pointer to adapter context area
110 PNIC_ADAPTER Adapter
= (PNIC_ADAPTER
)MiniportAdapterContext
;
112 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
117 /* Wait for any DPCs to complete. FIXME: Use something else */
118 NdisStallExecution(250000);
120 if (Adapter
->InterruptRegistered
)
121 /* Deregister interrupt */
122 NdisMDeregisterInterrupt(&Adapter
->Interrupt
);
124 if (Adapter
->IOPortRangeRegistered
)
125 /* Deregister I/O port range */
126 NdisMDeregisterIoPortRange(
127 Adapter
->MiniportAdapterHandle
,
128 Adapter
->IoBaseAddress
,
132 /* Remove adapter from global adapter list */
133 RemoveEntryList(&Adapter
->ListEntry
);
135 /* Free adapter context area */
136 NdisFreeMemory(Adapter
, sizeof(NIC_ADAPTER
), 0);
140 NDIS_STATUS
MiniportInitialize(
141 OUT PNDIS_STATUS OpenErrorStatus
,
142 OUT PUINT SelectedMediumIndex
,
143 IN PNDIS_MEDIUM MediumArray
,
144 IN UINT MediumArraySize
,
145 IN NDIS_HANDLE MiniportAdapterHandle
,
146 IN NDIS_HANDLE WrapperConfigurationContext
)
148 * FUNCTION: Adapter initialization function
150 * OpenErrorStatus = Address of buffer to place additional status information
151 * SelectedMediumIndex = Address of buffer to place selected medium index
152 * MediumArray = Pointer to an array of NDIS_MEDIUMs
153 * MediaArraySize = Number of elements in MediumArray
154 * MiniportAdapterHandle = Miniport adapter handle assigned by NDIS
155 * WrapperConfigurationContext = Handle used to identify configuration context
157 * Status of operation
162 PNIC_ADAPTER Adapter
;
164 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
166 /* Search for 802.3 media which is the only one we support */
167 for (i
= 0; i
< MediumArraySize
; i
++) {
168 if (MediumArray
[i
] == NdisMedium802_3
)
172 if (i
== MediumArraySize
) {
173 NDIS_DbgPrint(MIN_TRACE
, ("No supported medias.\n"));
174 return NDIS_STATUS_UNSUPPORTED_MEDIA
;
177 *SelectedMediumIndex
= i
;
179 Status
= NdisAllocateMemory((PVOID
)&Adapter
,
182 HighestAcceptableMax
);
183 if (Status
!= NDIS_STATUS_SUCCESS
) {
184 NDIS_DbgPrint(MIN_TRACE
, ("Insufficient resources.\n"));
188 NdisZeroMemory(Adapter
, sizeof(NIC_ADAPTER
));
189 Adapter
->MiniportAdapterHandle
= MiniportAdapterHandle
;
190 Adapter
->IoBaseAddress
= DRIVER_DEFAULT_IO_BASE_ADDRESS
;
191 Adapter
->InterruptNumber
= DRIVER_DEFAULT_INTERRUPT_NUMBER
;
192 Adapter
->MaxMulticastListSize
= DRIVER_MAX_MULTICAST_LIST_SIZE
;
193 Adapter
->InterruptMask
= DRIVER_INTERRUPT_MASK
;
194 Adapter
->LookaheadSize
= DRIVER_MAXIMUM_LOOKAHEAD
;
197 MiniportAdapterHandle
,
198 (NDIS_HANDLE
)Adapter
,
202 Status
= NdisMRegisterIoPortRange(
203 (PVOID
*)&Adapter
->IOBase
,
204 MiniportAdapterHandle
,
205 Adapter
->IoBaseAddress
,
208 if (Status
!= NDIS_STATUS_SUCCESS
) {
209 NDIS_DbgPrint(MIN_TRACE
, ("Cannot register port range. Status (0x%X).\n", Status
));
210 MiniportHalt((NDIS_HANDLE
)Adapter
);
214 Adapter
->IOPortRangeRegistered
= TRUE
;
218 Status
= NICInitialize(Adapter
);
219 if (Status
!= NDIS_STATUS_SUCCESS
) {
220 NDIS_DbgPrint(MIN_TRACE
, ("Cannot find NE2000 NIC. Status (0x%X).\n", Status
));
221 MiniportHalt((NDIS_HANDLE
)Adapter
);
225 NDIS_DbgPrint(MAX_TRACE
, ("BOARDDATA:\n"));
226 for (i
= 0; i
< 4; i
++) {
227 NDIS_DbgPrint(MAX_TRACE
, ("%02X %02X %02X %02X\n",
228 Adapter
->SAPROM
[i
*4+0],
229 Adapter
->SAPROM
[i
*4+1],
230 Adapter
->SAPROM
[i
*4+2],
231 Adapter
->SAPROM
[i
*4+3]));
234 /* Setup adapter structure */
235 Adapter
->TXStart
= ((ULONG_PTR
)Adapter
->RamBase
>> 8);
236 Adapter
->TXCount
= DRIVER_DEFAULT_TX_BUFFER_COUNT
;
237 Adapter
->TXFree
= DRIVER_DEFAULT_TX_BUFFER_COUNT
;
238 Adapter
->TXCurrent
= -1;
239 Adapter
->PageStart
= Adapter
->TXStart
+ Adapter
->TXCount
;
240 Adapter
->PageStop
= Adapter
->TXStart
+ (Adapter
->RamSize
>> 8);
242 /* Initialize multicast address mask to accept all */
243 for (i
= 0; i
< 8; i
++)
244 Adapter
->MulticastAddressMask
[i
] = 0xFF;
249 NDIS_DbgPrint(MIN_TRACE
, ("TXStart (0x%X) TXCount (0x%X) PageStart (0x%X)\n",
252 Adapter
->PageStart
));
254 NDIS_DbgPrint(MIN_TRACE
, ("PageStop (0x%X) CurrentPage (0x%X) NextPacket (0x%X).\n",
256 Adapter
->CurrentPage
,
257 Adapter
->NextPacket
));
259 /* Register the interrupt */
260 Status
= NdisMRegisterInterrupt(
262 MiniportAdapterHandle
,
263 Adapter
->InterruptNumber
,
264 Adapter
->InterruptNumber
,
267 NdisInterruptLatched
);
268 if (Status
!= NDIS_STATUS_SUCCESS
) {
269 NDIS_DbgPrint(MIN_TRACE
, ("Cannot register interrupt. Status (0x%X).\n", Status
));
270 MiniportHalt((NDIS_HANDLE
)Adapter
);
274 Adapter
->InterruptRegistered
= TRUE
;
279 /* Add adapter to the global adapter list */
280 InsertTailList(&DriverInfo
.AdapterListHead
, &Adapter
->ListEntry
);
282 NDIS_DbgPrint(MAX_TRACE
, ("Leaving.\n"));
284 return NDIS_STATUS_SUCCESS
;
289 OUT PBOOLEAN InterruptRecognized
,
290 OUT PBOOLEAN QueueMiniportHandleInterrupt
,
291 IN NDIS_HANDLE MiniportAdapterContext
)
293 * FUNCTION: Interrupt Service Routine for controlled adapters
295 * InterruptRecognized = Address of buffer to place wether
296 * the adapter generated the interrupt
297 * QueueMiniportHandleInterrupt = Address of buffer to place wether
298 * MiniportHandleInterrupt should be called
299 * MiniportAdapterContext = Pointer to adapter context area
301 * All pending interrupts are handled
304 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
306 NICDisableInterrupts((PNIC_ADAPTER
)MiniportAdapterContext
);
308 *InterruptRecognized
= TRUE
;
309 *QueueMiniportHandleInterrupt
= TRUE
;
313 NDIS_STATUS
MiniportQueryInformation(
314 IN NDIS_HANDLE MiniportAdapterContext
,
316 IN PVOID InformationBuffer
,
317 IN ULONG InformationBufferLength
,
318 OUT PULONG BytesWritten
,
319 OUT PULONG BytesNeeded
)
321 * FUNCTION: Handler to process queries
323 * MiniportAdapterContext = Pointer to adapter context area
324 * Oid = OID code designating query operation
325 * InformationBuffer = Address of return buffer
326 * InformationBufferLength = Length of return buffer
327 * BytesWritten = Address of buffer to place number of bytes returned
328 * BytesNeeded = Address of buffer to place number of bytes needed
329 * in InformationBuffer for specified OID
331 * Status of operation
338 USHORT GenericUSHORT
;
339 NDIS_MEDIUM Medium
= NdisMedium802_3
;
340 PNIC_ADAPTER Adapter
= (PNIC_ADAPTER
)MiniportAdapterContext
;
342 NDIS_DbgPrint(MAX_TRACE
, ("Called. Oid (0x%X).\n", Oid
));
344 Status
= NDIS_STATUS_SUCCESS
;
345 CopyFrom
= (PVOID
)&GenericULONG
;
346 CopySize
= sizeof(ULONG
);
349 case OID_GEN_SUPPORTED_LIST
:
350 CopyFrom
= (PVOID
)&MiniportOIDList
;
351 CopySize
= sizeof(MiniportOIDList
);
353 case OID_GEN_HARDWARE_STATUS
:
354 GenericULONG
= (ULONG
)NdisHardwareStatusReady
;
356 case OID_GEN_MEDIA_SUPPORTED
:
357 case OID_GEN_MEDIA_IN_USE
:
358 CopyFrom
= (PVOID
)&Medium
;
359 CopySize
= sizeof(NDIS_MEDIUM
);
361 case OID_GEN_MAXIMUM_LOOKAHEAD
:
362 GenericULONG
= DRIVER_MAXIMUM_LOOKAHEAD
;
364 case OID_GEN_MAXIMUM_FRAME_SIZE
:
365 GenericULONG
= DRIVER_FRAME_SIZE
- DRIVER_HEADER_SIZE
;
367 case OID_GEN_LINK_SPEED
:
368 GenericULONG
= 100000; /* 10Mbps */
370 case OID_GEN_TRANSMIT_BUFFER_SPACE
:
371 GenericULONG
= Adapter
->TXCount
* DRIVER_BLOCK_SIZE
;
373 case OID_GEN_RECEIVE_BUFFER_SPACE
:
374 GenericULONG
= Adapter
->RamSize
-
375 (ULONG_PTR
)Adapter
->RamBase
-
376 (Adapter
->TXCount
* DRIVER_BLOCK_SIZE
);
378 case OID_GEN_TRANSMIT_BLOCK_SIZE
:
379 GenericULONG
= DRIVER_BLOCK_SIZE
;
381 case OID_GEN_RECEIVE_BLOCK_SIZE
:
382 GenericULONG
= DRIVER_BLOCK_SIZE
;
384 case OID_GEN_VENDOR_ID
:
385 NdisMoveMemory(&GenericULONG
, &Adapter
->PermanentAddress
, 3);
386 GenericULONG
&= 0xFFFFFF00;
387 GenericULONG
|= 0x01;
389 case OID_GEN_VENDOR_DESCRIPTION
:
390 CopyFrom
= (PVOID
)&DRIVER_VENDOR_DESCRIPTION
;
391 CopySize
= sizeof(DRIVER_VENDOR_DESCRIPTION
);
393 case OID_GEN_VENDOR_DRIVER_VERSION
:
394 GenericUSHORT
= (USHORT
)DRIVER_VENDOR_DRIVER_VERSION
;
395 CopyFrom
= (PVOID
)&GenericUSHORT
;
396 CopySize
= sizeof(USHORT
);
398 case OID_GEN_CURRENT_PACKET_FILTER
:
399 GenericULONG
= Adapter
->PacketFilter
;
401 case OID_GEN_CURRENT_LOOKAHEAD
:
402 GenericULONG
= Adapter
->LookaheadSize
;
404 case OID_GEN_DRIVER_VERSION
:
405 GenericUSHORT
= ((USHORT
)DRIVER_NDIS_MAJOR_VERSION
<< 8) | DRIVER_NDIS_MINOR_VERSION
;
406 CopyFrom
= (PVOID
)&GenericUSHORT
;
407 CopySize
= sizeof(USHORT
);
409 case OID_GEN_MAXIMUM_TOTAL_SIZE
:
410 GenericULONG
= DRIVER_FRAME_SIZE
;
412 case OID_GEN_PROTOCOL_OPTIONS
:
413 NDIS_DbgPrint(MAX_TRACE
, ("OID_GEN_PROTOCOL_OPTIONS.\n"));
414 Status
= NDIS_STATUS_NOT_SUPPORTED
;
416 case OID_GEN_MAC_OPTIONS
:
417 GenericULONG
= NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA
|
418 NDIS_MAC_OPTION_RECEIVE_SERIALIZED
|
419 NDIS_MAC_OPTION_TRANSFERS_NOT_PEND
|
420 NDIS_MAC_OPTION_NO_LOOPBACK
;
422 case OID_GEN_MEDIA_CONNECT_STATUS
:
423 GenericULONG
= (ULONG
)NdisMediaStateConnected
;
425 case OID_GEN_MAXIMUM_SEND_PACKETS
:
428 case OID_802_3_PERMANENT_ADDRESS
:
429 CopyFrom
= (PVOID
)&Adapter
->PermanentAddress
;
430 CopySize
= DRIVER_LENGTH_OF_ADDRESS
;
432 case OID_802_3_CURRENT_ADDRESS
:
433 CopyFrom
= (PVOID
)&Adapter
->StationAddress
;
434 CopySize
= DRIVER_LENGTH_OF_ADDRESS
;
436 case OID_802_3_MULTICAST_LIST
:
437 NDIS_DbgPrint(MAX_TRACE
, ("OID_802_3_MULTICAST_LIST.\n"));
438 Status
= NDIS_STATUS_NOT_SUPPORTED
;
440 case OID_802_3_MAXIMUM_LIST_SIZE
:
441 GenericULONG
= Adapter
->MaxMulticastListSize
;
443 case OID_802_3_MAC_OPTIONS
:
444 NDIS_DbgPrint(MAX_TRACE
, ("OID_802_3_MAC_OPTIONS.\n"));
445 Status
= NDIS_STATUS_NOT_SUPPORTED
;
448 NDIS_DbgPrint(MIN_TRACE
, ("Unknown OID (0x%X).\n", Oid
));
449 Status
= NDIS_STATUS_INVALID_OID
;
453 if (Status
== NDIS_STATUS_SUCCESS
) {
454 if (CopySize
> InformationBufferLength
) {
455 *BytesNeeded
= (CopySize
- InformationBufferLength
);
457 Status
= NDIS_STATUS_INVALID_LENGTH
;
459 NdisMoveMemory(InformationBuffer
, CopyFrom
, CopySize
);
460 *BytesWritten
= CopySize
;
465 NDIS_DbgPrint(MAX_TRACE
, ("Leaving. Status is (0x%X).\n", Status
));
471 NDIS_STATUS
MiniportReconfigure(
472 OUT PNDIS_STATUS OpenErrorStatus
,
473 IN NDIS_HANDLE MiniportAdapterContext
,
474 IN NDIS_HANDLE WrapperConfigurationContext
)
476 * FUNCTION: Reconfigures an adapter
478 * OpenErrorStatus = Address of buffer to place additional status information
479 * MiniportAdapterContext = Pointer to adapter context area
480 * WrapperConfigurationContext = Handle used to identify configuration context
482 * Status of operation
484 * Never called by NDIS library
487 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
489 return NDIS_STATUS_FAILURE
;
494 NDIS_STATUS
MiniportReset(
495 OUT PBOOLEAN AddressingReset
,
496 IN NDIS_HANDLE MiniportAdapterContext
)
498 * FUNCTION: Resets an adapter
500 * AddressingReset = Address of a buffer to place value indicating
501 * wether NDIS library should call MiniportSetInformation
502 * to restore addressing information
503 * MiniportAdapterContext = Pointer to adapter context area
505 * Status of operation
508 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
510 return NDIS_STATUS_FAILURE
;
514 NDIS_STATUS
MiniportSend(
515 IN NDIS_HANDLE MiniportAdapterContext
,
516 IN PNDIS_PACKET Packet
,
519 * FUNCTION: Transmits a packet
521 * MiniportAdapterContext = Pointer to adapter context area
522 * Packet = Pointer to a packet descriptor specifying
523 * the data to be transmitted
524 * Flags = Specifies optional packet flags
526 * Status of operation
529 PNIC_ADAPTER Adapter
= (PNIC_ADAPTER
)MiniportAdapterContext
;
531 NDIS_DbgPrint(MAX_TRACE
, ("Queueing packet.\n"));
534 NdisMSendComplete(Adapter
->MiniportAdapterHandle
,
536 NDIS_STATUS_SUCCESS
);
538 /* Queue the packet on the transmit queue */
539 RESERVED(Packet
)->Next
= NULL
;
540 if (Adapter
->TXQueueHead
== NULL
) {
541 Adapter
->TXQueueHead
= Packet
;
543 RESERVED(Adapter
->TXQueueTail
)->Next
= Packet
;
546 Adapter
->TXQueueTail
= Packet
;
548 /* Transmit the packet */
549 NICTransmit(Adapter
);
551 return NDIS_STATUS_PENDING
;
555 NDIS_STATUS
MiniportSetInformation(
556 IN NDIS_HANDLE MiniportAdapterContext
,
558 IN PVOID InformationBuffer
,
559 IN ULONG InformationBufferLength
,
560 OUT PULONG BytesRead
,
561 OUT PULONG BytesNeeded
)
563 * FUNCTION: Changes state information in the driver
565 * MiniportAdapterContext = Pointer to adapter context area
566 * Oid = OID code designating set operation
567 * InformationBuffer = Pointer to buffer with state information
568 * InformationBufferLength = Length of InformationBuffer
569 * BytesRead = Address of buffer to place number of bytes read
570 * BytesNeeded = Address of buffer to place number of extra bytes
571 * needed in InformationBuffer for specified OID
573 * Status of operation
577 NDIS_STATUS Status
= NDIS_STATUS_SUCCESS
;
578 PNIC_ADAPTER Adapter
= (PNIC_ADAPTER
)MiniportAdapterContext
;
580 NDIS_DbgPrint(MAX_TRACE
, ("Called. Oid (0x%X).\n", Oid
));
583 case OID_GEN_CURRENT_PACKET_FILTER
:
585 if (InformationBufferLength
< sizeof(ULONG
)) {
587 *BytesNeeded
= sizeof(ULONG
) - InformationBufferLength
;
588 Status
= NDIS_STATUS_INVALID_LENGTH
;
592 NdisMoveMemory(&GenericULONG
, InformationBuffer
, sizeof(ULONG
));
593 /* Check for properties the driver don't support */
595 (NDIS_PACKET_TYPE_ALL_FUNCTIONAL
|
596 NDIS_PACKET_TYPE_FUNCTIONAL
|
597 NDIS_PACKET_TYPE_GROUP
|
598 NDIS_PACKET_TYPE_MAC_FRAME
|
599 NDIS_PACKET_TYPE_SMT
|
600 NDIS_PACKET_TYPE_SOURCE_ROUTING
)) {
603 Status
= NDIS_STATUS_NOT_SUPPORTED
;
607 Adapter
->PacketFilter
= GenericULONG
;
609 /* FIXME: Set filter on hardware */
612 case OID_GEN_CURRENT_LOOKAHEAD
:
614 if (InformationBufferLength
< sizeof(ULONG
)) {
616 *BytesNeeded
= sizeof(ULONG
) - InformationBufferLength
;
617 Status
= NDIS_STATUS_INVALID_LENGTH
;
621 NdisMoveMemory(&GenericULONG
, InformationBuffer
, sizeof(ULONG
));
622 if (GenericULONG
> DRIVER_MAXIMUM_LOOKAHEAD
)
623 Status
= NDIS_STATUS_INVALID_LENGTH
;
625 Adapter
->LookaheadSize
= GenericULONG
;
627 case OID_802_3_MULTICAST_LIST
:
628 /* Verify length. Must be multiplum of hardware address length */
629 if ((InformationBufferLength
% DRIVER_LENGTH_OF_ADDRESS
) != 0) {
632 Status
= NDIS_STATUS_INVALID_LENGTH
;
636 /* Set new multicast address list */
637 NdisMoveMemory(Adapter
->Addresses
, InformationBuffer
, InformationBufferLength
);
639 /* FIXME: Update hardware */
643 NDIS_DbgPrint(MIN_TRACE
, ("Invalid object ID (0x%X).\n", Oid
));
646 Status
= NDIS_STATUS_INVALID_OID
;
650 if (Status
== NDIS_STATUS_SUCCESS
) {
651 *BytesRead
= InformationBufferLength
;
655 NDIS_DbgPrint(MAX_TRACE
, ("Leaving. Status (0x%X).\n", Status
));
661 NDIS_STATUS
MiniportTransferData(
662 OUT PNDIS_PACKET Packet
,
663 OUT PUINT BytesTransferred
,
664 IN NDIS_HANDLE MiniportAdapterContext
,
665 IN NDIS_HANDLE MiniportReceiveContext
,
667 IN UINT BytesToTransfer
)
669 * FUNCTION: Transfers data from a received frame into an NDIS packet
671 * Packet = Address of packet to copy received data into
672 * BytesTransferred = Address of buffer to place number of bytes transmitted
673 * MiniportAdapterContext = Pointer to adapter context area
674 * MiniportReceiveContext = Pointer to receive context area (actually NULL)
675 * ByteOffset = Offset within received packet to begin copying
676 * BytesToTransfer = Number of bytes to copy into packet
678 * Status of operation
681 PNDIS_BUFFER DstBuffer
;
682 UINT BytesCopied
, BytesToCopy
, DstSize
;
687 PNIC_ADAPTER Adapter
= (PNIC_ADAPTER
)MiniportAdapterContext
;
689 NDIS_DbgPrint(MAX_TRACE
, ("Called. Packet (0x%X) ByteOffset (0x%X) BytesToTransfer (%d).\n",
690 Packet
, ByteOffset
, BytesToTransfer
));
692 if (BytesToTransfer
== 0) {
693 *BytesTransferred
= 0;
694 return NDIS_STATUS_SUCCESS
;
697 RecvStart
= Adapter
->PageStart
* DRIVER_BLOCK_SIZE
;
698 RecvStop
= Adapter
->PageStop
* DRIVER_BLOCK_SIZE
;
700 NdisQueryPacket(Packet
, NULL
, NULL
, &DstBuffer
, NULL
);
701 NdisQueryBuffer(DstBuffer
, (PVOID
)&DstData
, &DstSize
);
703 SrcData
= Adapter
->PacketOffset
+ sizeof(PACKET_HEADER
) + ByteOffset
;
704 if (ByteOffset
+ sizeof(PACKET_HEADER
) + BytesToTransfer
> Adapter
->PacketHeader
.PacketLength
)
705 BytesToTransfer
= Adapter
->PacketHeader
.PacketLength
- sizeof(PACKET_HEADER
) - ByteOffset
;
707 /* Start copying the data */
710 BytesToCopy
= (DstSize
< BytesToTransfer
)? DstSize
: BytesToTransfer
;
711 if (SrcData
+ BytesToCopy
> RecvStop
)
712 BytesToCopy
= (RecvStop
- SrcData
);
714 NICReadData(Adapter
, DstData
, SrcData
, BytesToCopy
);
716 BytesCopied
+= BytesToCopy
;
717 SrcData
+= BytesToCopy
;
718 (ULONG_PTR
)DstData
+= BytesToCopy
;
719 BytesToTransfer
-= BytesToCopy
;
720 if (BytesToTransfer
== 0)
723 DstSize
-= BytesToCopy
;
725 /* No more bytes in destination buffer. Proceed to
726 the next buffer in the destination buffer chain */
727 NdisGetNextBuffer(DstBuffer
, &DstBuffer
);
731 NdisQueryBuffer(DstBuffer
, (PVOID
)&DstData
, &DstSize
);
734 if (SrcData
== RecvStop
)
738 NDIS_DbgPrint(MAX_TRACE
, ("Transferred (%d) bytes.\n", BytesToTransfer
));
740 *BytesTransferred
= BytesCopied
;
742 return NDIS_STATUS_SUCCESS
;
751 PDRIVER_OBJECT DriverObject
,
752 PUNICODE_STRING RegistryPath
)
754 * FUNCTION: Main driver entry point
756 * DriverObject = Pointer to a driver object for this driver
757 * RegistryPath = Registry node for configuration parameters
759 * Status of driver initialization
763 NDIS_HANDLE NdisWrapperHandle
;
764 NDIS_MINIPORT_CHARACTERISTICS Miniport
;
766 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
768 NdisZeroMemory(&Miniport
, sizeof(Miniport
));
769 Miniport
.MajorNdisVersion
= DRIVER_NDIS_MAJOR_VERSION
;
770 Miniport
.MinorNdisVersion
= DRIVER_NDIS_MINOR_VERSION
;
771 Miniport
.CheckForHangHandler
= NULL
; //MiniportCheckForHang;
772 Miniport
.DisableInterruptHandler
= MiniportDisableInterrupt
;
773 Miniport
.EnableInterruptHandler
= MiniportEnableInterrupt
;
774 Miniport
.HaltHandler
= MiniportHalt
;
775 Miniport
.HandleInterruptHandler
= MiniportHandleInterrupt
;
776 Miniport
.InitializeHandler
= MiniportInitialize
;
777 Miniport
.ISRHandler
= MiniportISR
;
778 Miniport
.QueryInformationHandler
= MiniportQueryInformation
;
779 Miniport
.ReconfigureHandler
= MiniportReconfigure
;
780 Miniport
.ResetHandler
= MiniportReset
;
781 Miniport
.u1
.SendHandler
= MiniportSend
;
782 Miniport
.SetInformationHandler
= MiniportSetInformation
;
783 Miniport
.u2
.TransferDataHandler
= MiniportTransferData
;
785 NdisMInitializeWrapper(&NdisWrapperHandle
,
790 DriverInfo
.NdisWrapperHandle
= NdisWrapperHandle
;
791 DriverInfo
.NdisMacHandle
= NULL
;
792 InitializeListHead(&DriverInfo
.AdapterListHead
);
794 Status
= NdisMRegisterMiniport(NdisWrapperHandle
,
796 sizeof(NDIS_MINIPORT_CHARACTERISTICS
));
797 if (Status
!= NDIS_STATUS_SUCCESS
) {
798 NDIS_DbgPrint(MIN_TRACE
, ("NdisMRegisterMiniport() failed with status code (0x%X).\n", Status
));
799 NdisTerminateWrapper(NdisWrapperHandle
, NULL
);
800 return STATUS_UNSUCCESSFUL
;
803 return STATUS_SUCCESS
;