summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp
diff options
context:
space:
mode:
author5an7y-Microsoft <[email protected]>2026-06-19 13:23:44 -0700
committerGitHub <[email protected]>2026-06-19 13:23:44 -0700
commit26741c75857c7df2fd95efe632f8f5f70b71fdbb (patch)
tree58d74336b33f09a11d9427f8eba76f7fa84d9d47 /network/netadaptercx/netvadapterlibrary/code/txqueue.cpp
parente99ae832b48b245404f9bd750af4864247b061e8 (diff)
parent8315a48cc6aac0c02d2218b0147457a01de4f885 (diff)
Merge pull request #1394 from youyanggit/WifiihvsampleDataPath
Add End-to-End NetAdapterCx/WiFiCx Sample Drivers and OEM Communication Examples
Diffstat (limited to 'network/netadaptercx/netvadapterlibrary/code/txqueue.cpp')
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/txqueue.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp b/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp
new file mode 100644
index 00000000..b67692b5
--- /dev/null
+++ b/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp
@@ -0,0 +1,118 @@
+// Copyright (c) Microsoft Corporation. All rights reserved
+
+#include "pch.hpp"
+#include "netvadapter.h"
+#include "txqueue.h"
+
+NetvTxQueue::NetvTxQueue(
+ NETPACKETQUEUE Handle,
+ NetvAdapter & Adapter
+) noexcept
+ : NetvQueue{Handle, Adapter, NetTxQueueGetRingCollection(Handle)}
+{
+ NET_EXTENSION_QUERY extension;
+ NET_EXTENSION_QUERY_INIT(
+ &extension,
+ NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_NAME,
+ NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_VERSION_1,
+ NetExtensionTypeFragment);
+
+ NetTxQueueGetExtension(m_handle, &extension, &VirtualAddressExtension);
+
+ NET_EXTENSION_QUERY_INIT(
+ &extension,
+ NET_PACKET_EXTENSION_GSO_NAME,
+ NET_PACKET_EXTENSION_GSO_VERSION_1,
+ NetExtensionTypePacket);
+
+ NetTxQueueGetExtension(m_handle, &extension, &UsoExtension);
+
+ EnlQueueHandle = EnlCreateQueue(Handle, TX);
+}
+
+_Use_decl_annotations_
+void
+NetvTxQueue::Destroy(
+ void
+)
+{
+ EnlDestroyQueue(EnlQueueHandle, TX);
+}
+
+void
+NetvTxQueue::Start(
+ void
+)
+{
+ auto link = NetvEnlMLink[m_adapter.EnlIndex].LinkHandle[0];
+ auto port = &link->Ports[m_adapter.EnlPortIndex];
+ auto queue = &port->TxQueue[0];
+
+ NT_ASSERT(queue->State == Stopped);
+
+ queue->QueueNext = queue->QueueEnd = 0U;
+
+ EnlIndicateQueueState(EnlQueueHandle, Started);
+}
+
+void
+NetvTxQueue::Stop(
+ void
+)
+{
+ EnlIndicateQueueState(EnlQueueHandle, Stopped);
+}
+
+_Use_decl_annotations_
+void
+NetvTxQueue::Advance(
+ void
+)
+{
+ auto pr = GetPacketRing();
+ auto pi = NetRingGetAllPackets(m_rings);
+
+ // drain Tx packets
+ for (; NetPacketIteratorHasAny(&pi); NetPacketIteratorAdvance(&pi))
+ {
+ auto packet = NetPacketIteratorGetPacket(&pi);
+ if (! packet->Scratch)
+ {
+ break;
+ }
+
+ auto fi = NetPacketIteratorGetFragments(&pi);
+ for (; NetFragmentIteratorHasAny(&fi); NetFragmentIteratorAdvance(&fi))
+ {
+ continue;
+ }
+
+ m_rings->Rings[NetRingTypeFragment]->BeginIndex =
+ NetFragmentIteratorGetIndex(&fi);
+ }
+
+ NetPacketIteratorSet(&pi);
+
+ // post Tx packets
+ EnlRingDoorBell(EnlQueueHandle, pr->EndIndex);
+}
+
+_Use_decl_annotations_
+void
+NetvTxQueue::Cancel(
+ void
+)
+{
+ auto ringBuffer = GetPacketRing();
+
+ EnlRingDoorBell(EnlQueueHandle, ringBuffer->EndIndex);
+}
+
+_Use_decl_annotations_
+void
+NetvTxQueue::SetNotify(
+ bool NotificationEnabled
+)
+{
+ EnlArmInterrupt(EnlQueueHandle, NotificationEnabled);
+}