2 * ReactOS Realtek 8139 Driver
4 * Copyright (C) 2013 Cameron Gutman
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 static ULONG SupportedOidList
[] =
29 OID_GEN_SUPPORTED_LIST
,
30 OID_GEN_HARDWARE_STATUS
,
31 OID_GEN_MEDIA_SUPPORTED
,
33 OID_GEN_MAXIMUM_LOOKAHEAD
,
34 OID_GEN_MAXIMUM_FRAME_SIZE
,
36 OID_GEN_TRANSMIT_BUFFER_SPACE
,
37 OID_GEN_RECEIVE_BUFFER_SPACE
,
38 OID_GEN_RECEIVE_BLOCK_SIZE
,
39 OID_GEN_TRANSMIT_BLOCK_SIZE
,
41 OID_GEN_VENDOR_DESCRIPTION
,
42 OID_GEN_VENDOR_DRIVER_VERSION
,
43 OID_GEN_CURRENT_PACKET_FILTER
,
44 OID_GEN_CURRENT_LOOKAHEAD
,
45 OID_GEN_DRIVER_VERSION
,
46 OID_GEN_MAXIMUM_TOTAL_SIZE
,
47 OID_GEN_PROTOCOL_OPTIONS
,
49 OID_GEN_MEDIA_CONNECT_STATUS
,
50 OID_GEN_MAXIMUM_SEND_PACKETS
,
55 OID_GEN_RCV_NO_BUFFER
,
56 OID_GEN_RCV_CRC_ERROR
,
57 OID_802_3_PERMANENT_ADDRESS
,
58 OID_802_3_CURRENT_ADDRESS
,
59 OID_802_3_MULTICAST_LIST
,
60 OID_802_3_MAXIMUM_LIST_SIZE
,
61 OID_802_3_MAC_OPTIONS
,
62 OID_802_3_RCV_ERROR_ALIGNMENT
,
63 OID_802_3_XMIT_ONE_COLLISION
,
64 OID_802_3_XMIT_MORE_COLLISIONS
69 MiniportQueryInformation (
70 IN NDIS_HANDLE MiniportAdapterContext
,
72 IN PVOID InformationBuffer
,
73 IN ULONG InformationBufferLength
,
74 OUT PULONG BytesWritten
,
75 OUT PULONG BytesNeeded
78 PRTL_ADAPTER adapter
= (PRTL_ADAPTER
)MiniportAdapterContext
;
84 status
= NDIS_STATUS_SUCCESS
;
85 copySource
= &genericUlong
;
86 copyLength
= sizeof(ULONG
);
88 NdisAcquireSpinLock(&adapter
->Lock
);
92 case OID_GEN_SUPPORTED_LIST
:
93 copySource
= (PVOID
)&SupportedOidList
;
94 copyLength
= sizeof(SupportedOidList
);
97 case OID_GEN_CURRENT_PACKET_FILTER
:
98 genericUlong
= adapter
->PacketFilter
;
101 case OID_GEN_HARDWARE_STATUS
:
102 genericUlong
= (ULONG
)NdisHardwareStatusReady
; //FIXME
105 case OID_GEN_MEDIA_SUPPORTED
:
106 case OID_GEN_MEDIA_IN_USE
:
108 static const NDIS_MEDIUM medium
= NdisMedium802_3
;
109 copySource
= (PVOID
)&medium
;
110 copyLength
= sizeof(medium
);
114 case OID_GEN_RECEIVE_BLOCK_SIZE
:
115 case OID_GEN_TRANSMIT_BLOCK_SIZE
:
116 case OID_GEN_CURRENT_LOOKAHEAD
:
117 case OID_GEN_MAXIMUM_LOOKAHEAD
:
118 case OID_GEN_MAXIMUM_FRAME_SIZE
:
119 genericUlong
= MAXIMUM_FRAME_SIZE
- sizeof(ETH_HEADER
);
122 case OID_GEN_LINK_SPEED
:
123 genericUlong
= adapter
->LinkSpeedMbps
* 1000;
126 case OID_GEN_TRANSMIT_BUFFER_SPACE
:
127 genericUlong
= MAXIMUM_FRAME_SIZE
;
130 case OID_GEN_RECEIVE_BUFFER_SPACE
:
131 genericUlong
= RECEIVE_BUFFER_SIZE
;
134 case OID_GEN_VENDOR_ID
:
136 // The 3 bytes of the MAC address is the vendor ID
139 genericUlong
|= (adapter
->PermanentMacAddress
[0] << 16);
140 genericUlong
|= (adapter
->PermanentMacAddress
[1] << 8);
141 genericUlong
|= (adapter
->PermanentMacAddress
[2] & 0xFF);
144 case OID_GEN_VENDOR_DESCRIPTION
:
146 static UCHAR vendorDesc
[] = "ReactOS Team";
147 copySource
= vendorDesc
;
148 copyLength
= sizeof(vendorDesc
);
152 case OID_GEN_VENDOR_DRIVER_VERSION
:
153 genericUlong
= DRIVER_VERSION
;
156 case OID_GEN_DRIVER_VERSION
:
158 static const USHORT driverVersion
=
159 (NDIS_MINIPORT_MAJOR_VERSION
<< 8) + NDIS_MINIPORT_MINOR_VERSION
;
160 copySource
= (PVOID
)&driverVersion
;
161 copyLength
= sizeof(driverVersion
);
165 case OID_GEN_MAXIMUM_TOTAL_SIZE
:
166 genericUlong
= MAXIMUM_FRAME_SIZE
;
169 case OID_GEN_PROTOCOL_OPTIONS
:
170 NDIS_DbgPrint(MIN_TRACE
, ("OID_GEN_PROTOCOL_OPTIONS is unimplemented\n"));
171 status
= NDIS_STATUS_NOT_SUPPORTED
;
174 case OID_GEN_MAC_OPTIONS
:
175 genericUlong
= NDIS_MAC_OPTION_RECEIVE_SERIALIZED
|
176 NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA
|
177 NDIS_MAC_OPTION_TRANSFERS_NOT_PEND
|
178 NDIS_MAC_OPTION_NO_LOOPBACK
;
181 case OID_GEN_MEDIA_CONNECT_STATUS
:
182 genericUlong
= adapter
->MediaState
;
185 case OID_GEN_MAXIMUM_SEND_PACKETS
:
189 case OID_802_3_CURRENT_ADDRESS
:
190 copySource
= adapter
->CurrentMacAddress
;
191 copyLength
= IEEE_802_ADDR_LENGTH
;
194 case OID_802_3_PERMANENT_ADDRESS
:
195 copySource
= adapter
->PermanentMacAddress
;
196 copyLength
= IEEE_802_ADDR_LENGTH
;
199 case OID_802_3_MAXIMUM_LIST_SIZE
:
200 genericUlong
= MAXIMUM_MULTICAST_ADDRESSES
;
203 case OID_GEN_XMIT_OK
:
204 genericUlong
= adapter
->TransmitOk
;
208 genericUlong
= adapter
->ReceiveOk
;
211 case OID_GEN_XMIT_ERROR
:
212 genericUlong
= adapter
->TransmitError
;
215 case OID_GEN_RCV_ERROR
:
216 genericUlong
= adapter
->ReceiveError
;
219 case OID_GEN_RCV_NO_BUFFER
:
220 genericUlong
= adapter
->ReceiveNoBufferSpace
;
223 case OID_GEN_RCV_CRC_ERROR
:
224 genericUlong
= adapter
->ReceiveCrcError
;
227 case OID_802_3_RCV_ERROR_ALIGNMENT
:
228 genericUlong
= adapter
->ReceiveAlignmentError
;
231 case OID_802_3_XMIT_ONE_COLLISION
:
232 genericUlong
= adapter
->TransmitOneCollision
;
235 case OID_802_3_XMIT_MORE_COLLISIONS
:
236 genericUlong
= adapter
->TransmitMoreCollisions
;
240 NDIS_DbgPrint(MIN_TRACE
, ("Unknown OID\n"));
241 status
= NDIS_STATUS_NOT_SUPPORTED
;
245 if (status
== NDIS_STATUS_SUCCESS
)
247 if (copyLength
> InformationBufferLength
)
249 *BytesNeeded
= copyLength
;
251 status
= NDIS_STATUS_INVALID_LENGTH
;
255 NdisMoveMemory(InformationBuffer
, copySource
, copyLength
);
256 *BytesWritten
= copyLength
;
257 *BytesNeeded
= copyLength
;
266 NdisReleaseSpinLock(&adapter
->Lock
);
268 NDIS_DbgPrint(MAX_TRACE
, ("Query OID 0x%x: Completed with status 0x%x (%d, %d)\n",
269 Oid
, status
, *BytesWritten
, *BytesNeeded
));
276 MiniportSetInformation (
277 IN NDIS_HANDLE MiniportAdapterContext
,
279 IN PVOID InformationBuffer
,
280 IN ULONG InformationBufferLength
,
281 OUT PULONG BytesRead
,
282 OUT PULONG BytesNeeded
285 PRTL_ADAPTER adapter
= (PRTL_ADAPTER
)MiniportAdapterContext
;
289 status
= NDIS_STATUS_SUCCESS
;
291 NdisAcquireSpinLock(&adapter
->Lock
);
295 case OID_GEN_CURRENT_PACKET_FILTER
:
296 if (InformationBufferLength
< sizeof(ULONG
))
299 *BytesNeeded
= sizeof(ULONG
);
300 status
= NDIS_STATUS_INVALID_LENGTH
;
304 NdisMoveMemory(&genericUlong
, InformationBuffer
, sizeof(ULONG
));
307 (NDIS_PACKET_TYPE_ALL_FUNCTIONAL
|
308 NDIS_PACKET_TYPE_FUNCTIONAL
|
309 NDIS_PACKET_TYPE_GROUP
|
310 NDIS_PACKET_TYPE_MAC_FRAME
|
311 NDIS_PACKET_TYPE_SMT
|
312 NDIS_PACKET_TYPE_SOURCE_ROUTING
))
314 *BytesRead
= sizeof(ULONG
);
315 *BytesNeeded
= sizeof(ULONG
);
316 status
= NDIS_STATUS_NOT_SUPPORTED
;
320 adapter
->PacketFilter
= genericUlong
;
322 status
= NICApplyPacketFilter(adapter
);
323 if (status
!= NDIS_STATUS_SUCCESS
)
325 NDIS_DbgPrint(MIN_TRACE
, ("Failed to apply new packet filter\n"));
331 case OID_GEN_CURRENT_LOOKAHEAD
:
332 if (InformationBufferLength
< sizeof(ULONG
))
335 *BytesNeeded
= sizeof(ULONG
);
336 status
= NDIS_STATUS_INVALID_LENGTH
;
340 NdisMoveMemory(&genericUlong
, InformationBuffer
, sizeof(ULONG
));
342 if (genericUlong
> MAXIMUM_FRAME_SIZE
- sizeof(ETH_HEADER
))
344 status
= NDIS_STATUS_INVALID_DATA
;
353 case OID_802_3_MULTICAST_LIST
:
354 if (InformationBufferLength
% IEEE_802_ADDR_LENGTH
)
357 *BytesNeeded
= InformationBufferLength
+ (InformationBufferLength
% IEEE_802_ADDR_LENGTH
);
358 status
= NDIS_STATUS_INVALID_LENGTH
;
362 if (InformationBufferLength
/ 6 > MAXIMUM_MULTICAST_ADDRESSES
)
364 *BytesNeeded
= MAXIMUM_MULTICAST_ADDRESSES
* IEEE_802_ADDR_LENGTH
;
366 status
= NDIS_STATUS_INVALID_LENGTH
;
370 NdisMoveMemory(adapter
->MulticastList
, InformationBuffer
, InformationBufferLength
);
372 // FIXME: Write to device
377 NDIS_DbgPrint(MIN_TRACE
, ("Unknown OID\n"));
378 status
= NDIS_STATUS_NOT_SUPPORTED
;
384 if (status
== NDIS_STATUS_SUCCESS
)
386 *BytesRead
= InformationBufferLength
;
390 NdisReleaseSpinLock(&adapter
->Lock
);