summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapter/drivercode/device.cpp
diff options
context:
space:
mode:
author5an7y-Microsoft <[email protected]>2026-07-09 14:59:40 -0700
committerGitHub <[email protected]>2026-07-09 14:59:40 -0700
commit15640356a5a6eeafefff403f6d287821213635cd (patch)
tree49e5fcd168d50912decc42dda76767b3566887b1 /network/netadaptercx/netvadapter/drivercode/device.cpp
parent7c8087c61eb674e321458f935b6676652c39924d (diff)
parent2ee527bfeb0aeb6be11f0a8b6dce4011b358ce89 (diff)
Merge pull request #1402 from microsoft/main
FI: Main -> Develop
Diffstat (limited to 'network/netadaptercx/netvadapter/drivercode/device.cpp')
-rw-r--r--network/netadaptercx/netvadapter/drivercode/device.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapter/drivercode/device.cpp b/network/netadaptercx/netvadapter/drivercode/device.cpp
new file mode 100644
index 00000000..6cbad327
--- /dev/null
+++ b/network/netadaptercx/netvadapter/drivercode/device.cpp
@@ -0,0 +1,126 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#include "pch.hpp"
+
+#include <wil/resource.h>
+
+#include "netvadapter.h"
+#include "device.h"
+#include "trace.h"
+#include "device.tmh"
+#include "power.h"
+
+static
+EVT_NET_ADAPTER_CREATE_TXQUEUE
+ EvtAdapterCreateTxQueue;
+
+static
+EVT_NET_ADAPTER_CREATE_RXQUEUE
+ EvtAdapterCreateRxQueue;
+
+NetvDevice::NetvDevice(
+ WDFDEVICE Handle
+)
+ : m_triage(WdfGetTriageInfo())
+ , m_handle(Handle)
+{
+}
+
+_Use_decl_annotations_
+NTSTATUS
+NetvDevice::Initialize(
+ void
+)
+{
+ using unique_adapterinit = wil::unique_any<NETADAPTER_INIT*,
+ decltype(&::NetAdapterInitFree),
+ ::NetAdapterInitFree>;
+
+ unique_adapterinit adapterInit{NetAdapterInitAllocate(m_handle)};
+ RETURN_NTSTATUS_IF(
+ STATUS_INSUFFICIENT_RESOURCES,
+ ! adapterInit);
+
+ NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks;
+ NET_ADAPTER_DATAPATH_CALLBACKS_INIT(
+ &datapathCallbacks,
+ EvtAdapterCreateTxQueue,
+ EvtAdapterCreateRxQueue);
+
+ NetAdapterInitSetDatapathCallbacks(
+ adapterInit.get(),
+ &datapathCallbacks);
+
+ WDF_OBJECT_ATTRIBUTES adapterAttributes;
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, NetvAdapter);
+ adapterAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) {
+ NetvAdapterGetContext(static_cast<NETADAPTER>(Handle))->Destroy();
+ };
+
+ NETADAPTER netAdapter;
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetAdapterCreate(adapterInit.get(), &adapterAttributes, &netAdapter));
+
+ m_adapter = new (NetvAdapterGetContext(netAdapter)) NetvAdapter(netAdapter, m_handle);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ m_adapter->Initialize());
+
+ RETURN_STATUS_SUCCESS();
+}
+
+NTSTATUS
+NetvDevice::PrepareHardware(
+ WDFCMRESLIST ResourcesRaw,
+ WDFCMRESLIST ResourcesTranslated
+)
+{
+ UNREFERENCED_PARAMETER(ResourcesRaw);
+ UNREFERENCED_PARAMETER(ResourcesTranslated);
+
+ NetvDeviceInitializePowerManagement(this);
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ m_adapter->ConfigureDataCapabilities());
+
+ RETURN_IF_NOT_STATUS_SUCCESS(
+ NetAdapterStart(m_adapter->m_handle));
+
+ RETURN_STATUS_SUCCESS();
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtDevicePrepareHardware(
+ WDFDEVICE Device,
+ WDFCMRESLIST ResourcesRaw,
+ WDFCMRESLIST ResourcesTranslated
+ )
+{
+ return NetvDeviceGetContext(Device)->PrepareHardware(ResourcesRaw, ResourcesTranslated);
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtAdapterCreateTxQueue(
+ NETADAPTER Adapter,
+ NETTXQUEUE_INIT * Init
+)
+{
+ return NetvAdapterGetContext(Adapter)->CreateTxQueue(Init);
+}
+
+_Use_decl_annotations_
+NTSTATUS
+EvtAdapterCreateRxQueue(
+ NETADAPTER Adapter,
+ NETRXQUEUE_INIT * Init
+)
+{
+ return NetvAdapterGetContext(Adapter)->CreateRxQueue(Init);
+}
+
+NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter)
+{
+ return NetvAdapterGetContext(netAdapter);
+}