Skip to content

Commit dbe70bf

Browse files
committed
Initial import
0 parents  commit dbe70bf

47 files changed

Lines changed: 22018 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.vs
2+
ARM64
3+
x64
4+
*.log
5+
*.sln

adapter.cpp

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
#include "precomp.h"
2+
3+
#include "trace.h"
4+
#include "device.h"
5+
#include "adapter.h"
6+
#include "txqueue.h"
7+
#include "rxqueue.h"
8+
#include "link.h"
9+
10+
NTSTATUS
11+
IgbInitializeAdapterContext(
12+
_In_ IGB_ADAPTER* adapter,
13+
_In_ WDFDEVICE device,
14+
_In_ NETADAPTER netAdapter)
15+
{
16+
DBGPRINT("IntelInitializeAdapterContext\n");
17+
18+
NTSTATUS status = STATUS_SUCCESS;
19+
20+
adapter->NetAdapter = netAdapter;
21+
adapter->WdfDevice = device;
22+
IgbGetDeviceContext(device)->Adapter = adapter;
23+
24+
WDF_OBJECT_ATTRIBUTES attributes;
25+
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
26+
attributes.ParentObject = device;
27+
28+
GOTO_IF_NOT_NT_SUCCESS(Exit, status,
29+
WdfSpinLockCreate(&attributes, &adapter->Lock));
30+
31+
WDF_OBJECT_ATTRIBUTES timerAttributes;
32+
WDF_OBJECT_ATTRIBUTES_INIT(&timerAttributes);
33+
timerAttributes.ParentObject = device;
34+
35+
Exit:
36+
DBGPRINT("IntelInitializeAdapterContext - %x\n", status);
37+
38+
return status;
39+
}
40+
41+
static void
42+
IgbUpdateReceiveFilters(
43+
_In_ IGB_ADAPTER* adapter)
44+
{
45+
NET_PACKET_FILTER_FLAGS packetFilterFlags = adapter->PacketFilterFlags;
46+
u32 rctl;
47+
48+
rctl = E1000_READ_REG(&adapter->Hw, E1000_RCTL);
49+
rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
50+
if ((packetFilterFlags & NetPacketFilterFlagPromiscuous) != 0)
51+
{
52+
// Receive everything
53+
rctl |= E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_BAM;
54+
}
55+
else
56+
{
57+
if ((packetFilterFlags & NetPacketFilterFlagAllMulticast) != 0)
58+
rctl |= E1000_RCTL_MPE;
59+
60+
if ((packetFilterFlags & NetPacketFilterFlagBroadcast) != 0)
61+
rctl |= E1000_RCTL_BAM;
62+
63+
e1000_rar_set(&adapter->Hw, adapter->CurrentAddress.Address, 0);
64+
65+
if ((packetFilterFlags & NetPacketFilterFlagMulticast) != 0)
66+
e1000_update_mc_addr_list(&adapter->Hw, adapter->MCAddressList, adapter->MCAddressLength / ETH_LENGTH_OF_ADDRESS);
67+
else
68+
e1000_update_mc_addr_list(&adapter->Hw, NULL, 0);
69+
}
70+
E1000_WRITE_REG(&adapter->Hw, E1000_RCTL, rctl);
71+
}
72+
73+
static void
74+
EvtSetReceiveFilter(
75+
_In_ NETADAPTER netAdapter,
76+
_In_ NETRECEIVEFILTER handle)
77+
{
78+
DBGPRINT("EvtSetReceiveFilter\n");
79+
80+
IGB_ADAPTER* adapter = IgbGetAdapterContext(netAdapter);
81+
NET_PACKET_FILTER_FLAGS packetFilterFlags = NetReceiveFilterGetPacketFilter(handle);
82+
83+
adapter->PacketFilterFlags = NetReceiveFilterGetPacketFilter(handle);
84+
RtlZeroMemory(adapter->MCAddressList, sizeof(adapter->MCAddressList));
85+
86+
UINT address_count = (UINT)NetReceiveFilterGetMulticastAddressCount(handle);
87+
NET_ADAPTER_LINK_LAYER_ADDRESS const* address_list = NetReceiveFilterGetMulticastAddressList(handle);
88+
adapter->MCAddressLength = 0;
89+
for (int i = 0; i < address_count; i++)
90+
{
91+
if (address_list[i].Length == ETH_LENGTH_OF_ADDRESS)
92+
{
93+
RtlCopyMemory(
94+
adapter->MCAddressList + adapter->MCAddressLength,
95+
address_list[i].Address,
96+
ETH_LENGTH_OF_ADDRESS);
97+
adapter->MCAddressLength += ETH_LENGTH_OF_ADDRESS;
98+
}
99+
}
100+
101+
IgbUpdateReceiveFilters(adapter);
102+
}
103+
104+
static
105+
void
106+
IgbAdapterSetReceiveFilterCapabilities(
107+
_In_ IGB_ADAPTER const* adapter)
108+
{
109+
NET_ADAPTER_RECEIVE_FILTER_CAPABILITIES rxFilterCaps;
110+
NET_ADAPTER_RECEIVE_FILTER_CAPABILITIES_INIT(&rxFilterCaps, EvtSetReceiveFilter);
111+
rxFilterCaps.SupportedPacketFilters =
112+
NetPacketFilterFlagDirected | NetPacketFilterFlagMulticast |
113+
NetPacketFilterFlagAllMulticast | NetPacketFilterFlagBroadcast |
114+
NetPacketFilterFlagPromiscuous;
115+
rxFilterCaps.MaximumMulticastAddresses = E1000_RAR_ENTRIES;
116+
NetAdapterSetReceiveFilterCapabilities(adapter->NetAdapter, &rxFilterCaps);
117+
}
118+
119+
static
120+
void
121+
IgbAdapterSetLinkLayerCapabilities(
122+
_In_ IGB_ADAPTER* adapter)
123+
{
124+
NET_ADAPTER_LINK_LAYER_CAPABILITIES linkLayerCapabilities;
125+
NET_ADAPTER_LINK_LAYER_CAPABILITIES_INIT(&linkLayerCapabilities, 1'000'000'000, 1'000'000'000);
126+
NetAdapterSetLinkLayerCapabilities(adapter->NetAdapter, &linkLayerCapabilities);
127+
NetAdapterSetLinkLayerMtuSize(adapter->NetAdapter, 1500);
128+
NetAdapterSetPermanentLinkLayerAddress(adapter->NetAdapter, &adapter->PermanentAddress);
129+
NetAdapterSetCurrentLinkLayerAddress(adapter->NetAdapter, &adapter->CurrentAddress);
130+
}
131+
132+
static
133+
void
134+
IgbAdapterSetDatapathCapabilities(
135+
_In_ IGB_ADAPTER const* adapter)
136+
{
137+
NET_ADAPTER_DMA_CAPABILITIES txDmaCapabilities;
138+
NET_ADAPTER_DMA_CAPABILITIES_INIT(&txDmaCapabilities, adapter->DmaEnabler);
139+
140+
NET_ADAPTER_TX_CAPABILITIES txCapabilities;
141+
NET_ADAPTER_TX_CAPABILITIES_INIT_FOR_DMA(
142+
&txCapabilities,
143+
&txDmaCapabilities,
144+
1);
145+
146+
txCapabilities.FragmentRingNumberOfElementsHint = /*RE_TX_BUF_NUM*/1024;
147+
txCapabilities.MaximumNumberOfFragments = /*RE_NTXSEGS*/1;
148+
149+
NET_ADAPTER_DMA_CAPABILITIES rxDmaCapabilities;
150+
NET_ADAPTER_DMA_CAPABILITIES_INIT(&rxDmaCapabilities, adapter->DmaEnabler);
151+
152+
NET_ADAPTER_RX_CAPABILITIES rxCapabilities;
153+
NET_ADAPTER_RX_CAPABILITIES_INIT_SYSTEM_MANAGED_DMA(
154+
&rxCapabilities,
155+
&rxDmaCapabilities,
156+
IGB_BUF_SIZE,
157+
1);
158+
159+
rxCapabilities.FragmentBufferAlignment = /*RE_RX_BUFFER_ALIGN*/128;
160+
rxCapabilities.FragmentRingNumberOfElementsHint = /*RE_RX_BUF_NUM*/1024;
161+
162+
NetAdapterSetDataPathCapabilities(adapter->NetAdapter, &txCapabilities, &rxCapabilities);
163+
}
164+
165+
_Use_decl_annotations_
166+
NTSTATUS
167+
IgbAdapterStart(
168+
IGB_ADAPTER* adapter)
169+
{
170+
DBGPRINT("IntelAdapterStart\n");
171+
172+
NTSTATUS status = STATUS_SUCCESS;
173+
174+
IgbAdapterSetLinkLayerCapabilities(adapter);
175+
IgbAdapterSetReceiveFilterCapabilities(adapter);
176+
IgbAdapterSetDatapathCapabilities(adapter);
177+
178+
IgbUpdateReceiveFilters(adapter);
179+
180+
e1000_init_hw(&adapter->Hw);
181+
182+
GOTO_IF_NOT_NT_SUCCESS(
183+
Exit, status,
184+
NetAdapterStart(adapter->NetAdapter));
185+
186+
Exit:
187+
DBGPRINT("IntelAdapterStart - %x\n", status);
188+
189+
return status;
190+
}

adapter.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#pragma once
2+
3+
extern "C"
4+
{
5+
#include "e1000_api.h"
6+
}
7+
8+
#define IGB_MAX_TX_QUEUES 4
9+
#define IGB_MAX_RX_QUEUES 4
10+
#define IGB_MAX_MCAST_LIST 32
11+
12+
#define IGB_BUF_SIZE 2048
13+
14+
typedef struct _IGB_ADAPTER
15+
{
16+
WDFDEVICE WdfDevice;
17+
NETADAPTER NetAdapter;
18+
NETCONFIGURATION NetConfiguration;
19+
20+
WDFSPINLOCK Lock;
21+
WDFDMAENABLER DmaEnabler;
22+
23+
NETPACKETQUEUE TxQueues[IGB_MAX_TX_QUEUES];
24+
NETPACKETQUEUE RxQueues[IGB_MAX_RX_QUEUES];
25+
26+
PVOID MMIOAddress;
27+
SIZE_T MMIOSize;
28+
BUS_INTERFACE_STANDARD PciConfig;
29+
30+
IGB_INTERRUPT* Interrupt;
31+
32+
NET_PACKET_FILTER_FLAGS PacketFilterFlags;
33+
UINT MCAddressLength;
34+
UCHAR MCAddressList[E1000_RAR_ENTRIES * ETH_LENGTH_OF_ADDRESS];
35+
36+
// Configuration
37+
//REG_SPEED_SETTING SpeedDuplex;
38+
NET_ADAPTER_LINK_LAYER_ADDRESS PermanentAddress;
39+
NET_ADAPTER_LINK_LAYER_ADDRESS CurrentAddress;
40+
//BOOLEAN OverrideAddress;
41+
//FLOW_CTRL FlowControl;
42+
//UINT16 VlanID;
43+
//ULONG64 MaxSpeed;
44+
//BOOLEAN TxIpHwChkSum;
45+
//BOOLEAN TxTcpHwChkSum;
46+
//BOOLEAN TxUdpHwChkSum;
47+
//BOOLEAN RxIpHwChkSum;
48+
//BOOLEAN RxTcpHwChkSum;
49+
//BOOLEAN RxUdpHwChkSum;
50+
//BOOLEAN LSOv4;
51+
//BOOLEAN LSOv6;
52+
53+
struct e1000_hw Hw;
54+
} IGB_ADAPTER, *PIGB_ADAPTER;
55+
56+
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(IGB_ADAPTER, IgbGetAdapterContext);
57+
58+
EVT_NET_ADAPTER_CREATE_TXQUEUE EvtAdapterCreateTxQueue;
59+
EVT_NET_ADAPTER_CREATE_RXQUEUE EvtAdapterCreateRxQueue;
60+
61+
NTSTATUS
62+
IgbInitializeAdapterContext(
63+
_In_ PIGB_ADAPTER adapter,
64+
_In_ WDFDEVICE device,
65+
_In_ NETADAPTER netAdapter);
66+
67+
NTSTATUS
68+
IgbAdapterStart(
69+
_In_ IGB_ADAPTER* adapter);

0 commit comments

Comments
 (0)