summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang You (UU) <[email protected]>2025-11-20 11:45:37 -0800
committerYang You (UU) <[email protected]>2025-11-20 11:45:37 -0800
commitdd61a12239a771573bc87117119eceb082b9762b (patch)
tree217d018bd8e0132a97a7515a19e8674e9601b87c
parent25de639a793266bde0116816b86f8ada28808186 (diff)
have the Infrastructure ready to have the driver install success and able to start handling the WifiRequest
-rw-r--r--network/wlan/WIFICX/drivercode/adapter.cpp24
-rw-r--r--network/wlan/WIFICX/drivercode/device.h1
-rw-r--r--network/wlan/WIFICX/drivercode/umkmfusion.h43
-rw-r--r--network/wlan/WIFICX/drivercode/wifihal.cpp15
-rw-r--r--network/wlan/WIFICX/drivercode/wifitransition.cpp8
-rw-r--r--network/wlan/WIFICX/km/wificxsampleclientkm.inf2
-rw-r--r--network/wlan/WIFICX/um/wificxsampleclientum.infbin6802 -> 6508 bytes
7 files changed, 69 insertions, 24 deletions
diff --git a/network/wlan/WIFICX/drivercode/adapter.cpp b/network/wlan/WIFICX/drivercode/adapter.cpp
index f532ae02..958f69ea 100644
--- a/network/wlan/WIFICX/drivercode/adapter.cpp
+++ b/network/wlan/WIFICX/drivercode/adapter.cpp
@@ -27,20 +27,24 @@ NTSTATUS WifiIhvAdapterStart(NETADAPTER netAdapter)
{
TraceEntry();
- ULONG64 maxXmitLinkSpeed = WIFI_MEDIA_MAX_SPEED;
- ULONG64 maxRcvLinkSpeed = WIFI_MEDIA_MAX_SPEED;
-
- NET_ADAPTER_LINK_LAYER_CAPABILITIES linkLayerCapabilities;
- NET_ADAPTER_LINK_LAYER_CAPABILITIES_INIT(&linkLayerCapabilities, maxXmitLinkSpeed, maxRcvLinkSpeed);
-
- NetAdapterSetLinkLayerCapabilities(netAdapter, &linkLayerCapabilities);
-
- NetAdapterSetLinkLayerMtuSize(netAdapter, WIFI_MAX_PACKET_SIZE);
-
static WDI_MAC_ADDRESS STAAddress = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
NET_ADAPTER_LINK_LAYER_ADDRESS permanentLinkLayerAddress;
NET_ADAPTER_LINK_LAYER_ADDRESS_INIT(&permanentLinkLayerAddress, sizeof(WDI_MAC_ADDRESS), STAAddress.Address);
+ NetAdapterSetCurrentLinkLayerAddress(netAdapter, &permanentLinkLayerAddress);
NetAdapterSetPermanentLinkLayerAddress(netAdapter, &permanentLinkLayerAddress);
+
+ // Sample Phase 1 has no datapath support, so setting those values to the default one.
+ NET_ADAPTER_TX_CAPABILITIES txCaps;
+ NET_ADAPTER_RX_CAPABILITIES rxCaps;
+ NET_ADAPTER_LINK_LAYER_CAPABILITIES linkLayerCaps;
+
+ NET_ADAPTER_TX_CAPABILITIES_INIT(&txCaps, 1);
+ NET_ADAPTER_RX_CAPABILITIES_INIT_SYSTEM_MANAGED(&rxCaps, 1514, 1);
+ NET_ADAPTER_LINK_LAYER_CAPABILITIES_INIT(&linkLayerCaps, 0, 0);
+
+ NetAdapterSetLinkLayerMtuSize(netAdapter, 1500);
+ NetAdapterSetLinkLayerCapabilities(netAdapter, &linkLayerCaps);
+ NetAdapterSetDataPathCapabilities(netAdapter, &txCaps, &rxCaps);
WIFI_ADAPTER_WAKE_CAPABILITIES wakeCap{};
WIFI_ADAPTER_WAKE_CAPABILITIES_INIT(&wakeCap);
diff --git a/network/wlan/WIFICX/drivercode/device.h b/network/wlan/WIFICX/drivercode/device.h
index 8c00515e..bf70ba7b 100644
--- a/network/wlan/WIFICX/drivercode/device.h
+++ b/network/wlan/WIFICX/drivercode/device.h
@@ -20,7 +20,6 @@ typedef struct _WIFI_IHV_DEVICE_CONTEXT
WDFDEVICE WdfDevice;
TLV_CONTEXT TlvContext;
NETADAPTER primaryStaAdapter;
- WifiHAL* wifiHAL;
} WIFI_IHV_DEVICE_CONTEXT, * PWIFI_IHV_DEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_IHV_DEVICE_CONTEXT, WifiGetIhvDeviceContext);
diff --git a/network/wlan/WIFICX/drivercode/umkmfusion.h b/network/wlan/WIFICX/drivercode/umkmfusion.h
index 35e5a6cf..8f0db3f8 100644
--- a/network/wlan/WIFICX/drivercode/umkmfusion.h
+++ b/network/wlan/WIFICX/drivercode/umkmfusion.h
@@ -23,18 +23,47 @@ namespace Wifi
}
__inline
- NTSTATUS ConvertNDISSTATUSToNTSTATUS(NDIS_STATUS ndisStatus)
+ NTSTATUS ConvertNDISSTATUSToNTSTATUS(NDIS_STATUS NdisStatus)
{
- // NDIS_STATUS_SUCCESS is 0x00000000
- // Any non-success NDIS status should map to STATUS_UNSUCCESSFUL
- return (ndisStatus == NDIS_STATUS_SUCCESS) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
+ if (NT_SUCCESS(NdisStatus) && NdisStatus != NDIS_STATUS_SUCCESS && NdisStatus != NDIS_STATUS_PENDING &&
+ NdisStatus != NDIS_STATUS_INDICATION_REQUIRED)
+ {
+ // Case where an NDIS error is incorrectly mapped as a success by NT_SUCCESS macro
+ return STATUS_UNSUCCESSFUL;
+ }
+ else
+ {
+ switch (NdisStatus)
+ {
+ case NDIS_STATUS_BUFFER_TOO_SHORT:
+ return STATUS_BUFFER_TOO_SMALL;
+ break;
+ default:
+ return (NTSTATUS)NdisStatus;
+ break;
+ }
+ }
}
__inline
- NDIS_STATUS ConvertNTSTATUSToNDISSTATUS(NTSTATUS ntStatus)
+ NDIS_STATUS ConvertNTSTATUSToNDISSTATUS(NTSTATUS NtStatus)
{
- // Use NT_SUCCESS macro to check NTSTATUS
- return NT_SUCCESS(ntStatus) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE;
+ if (NT_SUCCESS(NtStatus) && NtStatus != STATUS_PENDING && NtStatus != STATUS_NDIS_INDICATION_REQUIRED)
+ {
+ return NDIS_STATUS_SUCCESS;
+ }
+ else
+ {
+ switch (NtStatus)
+ {
+ case STATUS_BUFFER_TOO_SMALL:
+ return NDIS_STATUS_BUFFER_TOO_SHORT;
+ break;
+ default:
+ return (NDIS_STATUS)NtStatus;
+ break;
+ }
+ }
}
_Must_inspect_result_
diff --git a/network/wlan/WIFICX/drivercode/wifihal.cpp b/network/wlan/WIFICX/drivercode/wifihal.cpp
index 4a73d386..87be1f6b 100644
--- a/network/wlan/WIFICX/drivercode/wifihal.cpp
+++ b/network/wlan/WIFICX/drivercode/wifihal.cpp
@@ -39,9 +39,20 @@ void WifiHAL::_OnCleanup(WDFOBJECT Object)
NTSTATUS WifiHAL::WifiIhvIsDeviceReadyForRequest()
{
- return ((m_Device != WDF_NO_HANDLE) // Make sure device is initialized (since this is hardware abstraction layer, IHV can replace with firmware state)
+ NTSTATUS status =
+ ((m_Device != WDF_NO_HANDLE) // Make sure device is initialized (since this is hardware abstraction layer, IHV can replace with firmware state)
&& (WifiGetIhvDeviceContext(m_Device)->primaryStaAdapter != WDF_NO_HANDLE) // In WIFICX, the logic sits on top of primary STA adapter, make sure it is initialized
&& (m_CurrentRadioState == TRUE) ? STATUS_SUCCESS : STATUS_DEVICE_NOT_READY); // Device is ready only if radio is ON (this may be replaced by other state in IHV implementation)
+
+ if(NT_SUCCESS(status) == FALSE)
+ {
+ WFCError(
+ "Device not ready for request. Device=%p, primaryStaAdapter=%p, CurrentRadioState=%u",
+ m_Device,
+ (m_Device != WDF_NO_HANDLE) ? WifiGetIhvDeviceContext(m_Device)->primaryStaAdapter : WDF_NO_HANDLE,
+ m_CurrentRadioState);
+ }
+ return status;
}
NTSTATUS WifiHAL::WifiIhvGetPendingTransitionStatus()
@@ -504,6 +515,7 @@ NTSTATUS WifiHAL::WifiIhvReset(const WDI_TASK_DOT11_RESET_PARAMETERS& ResetParam
_Use_decl_annotations_
NTSTATUS WifiHAL::WifiIhvSetRadioState(const WDI_SET_RADIO_STATE_PARAMETERS& RadioState, const PWDI_MESSAGE_HEADER pWdiHeader, UINT)
{
+ WFCInfo("Setting OS requested Radio State: SoftwareRadioState=%u\n", RadioState.SoftwareRadioState);
if (RadioState.SoftwareRadioState != m_CurrentRadioState)
{
// Change the radio state
@@ -518,6 +530,7 @@ NTSTATUS WifiHAL::WifiIhvSetRadioState(const WDI_SET_RADIO_STATE_PARAMETERS& Rad
RadioStatusParams.RadioState.SoftwareState = m_CurrentRadioState;
if (GenerateWdiIndicationRadioStatus(&RadioStatusParams, 0, m_TlvContext, &cbOutput, &pOutput) == NDIS_STATUS_SUCCESS)
{
+ WFCInfo("Indicate OS with Radio State: SoftwareRadioState=%u\n", m_CurrentRadioState);
WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_RADIO_STATUS, pOutput, cbOutput);
FreeGenerated(pOutput);
}
diff --git a/network/wlan/WIFICX/drivercode/wifitransition.cpp b/network/wlan/WIFICX/drivercode/wifitransition.cpp
index eccf9dc3..64811796 100644
--- a/network/wlan/WIFICX/drivercode/wifitransition.cpp
+++ b/network/wlan/WIFICX/drivercode/wifitransition.cpp
@@ -96,7 +96,7 @@ struct GenericTransitionTraits
if (TPreM3Fn)
{
// Call member function pointer on WifiHAL instance
- NTSTATUS preStatus = (c.DevCtx->wifiHAL->*TPreM3Fn)();
+ NTSTATUS preStatus = (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*TPreM3Fn)();
if (!NT_SUCCESS(preStatus))
{
return preStatus;
@@ -106,7 +106,7 @@ struct GenericTransitionTraits
if (THalM3Fn)
{
// Pass required third argument (BytesWriten) to HAL M3 function
- return (c.DevCtx->wifiHAL->*THalM3Fn)(p, c.Header, bytesWritten);
+ return (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*THalM3Fn)(p, c.Header, bytesWritten);
}
return STATUS_SUCCESS;
@@ -116,7 +116,7 @@ struct GenericTransitionTraits
{
if (TPreM4Fn)
{
- NTSTATUS preStatus = (c.DevCtx->wifiHAL->*TPreM4Fn)();
+ NTSTATUS preStatus = (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*TPreM4Fn)();
if (!NT_SUCCESS(preStatus))
{
return preStatus;
@@ -125,7 +125,7 @@ struct GenericTransitionTraits
if (THalM4Fn)
{
- return (c.DevCtx->wifiHAL->*THalM4Fn)(c.Header);
+ return (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*THalM4Fn)(c.Header);
}
return (TPreM4Fn == nullptr && THalM4Fn == nullptr) ? STATUS_PENDING : STATUS_SUCCESS;
diff --git a/network/wlan/WIFICX/km/wificxsampleclientkm.inf b/network/wlan/WIFICX/km/wificxsampleclientkm.inf
index d068b5ff..a29d9721 100644
--- a/network/wlan/WIFICX/km/wificxsampleclientkm.inf
+++ b/network/wlan/WIFICX/km/wificxsampleclientkm.inf
@@ -82,5 +82,5 @@ HKR, , NumberOfNetworkInterfaces, 0x00010001, 11
SPSVCINST_ASSOCSERVICE = 0x00000002
ManufacturerName = "WDK Sample"
DiskName = "Wificxsampleclientkm Installation Disk"
-wificxsampleclientkm.DeviceDesc = "Wificxsampleclientkm Device"
+wificxsampleclientkm.DeviceDesc = "[KMDF]Wificx Sample Client Device"
wificxsampleclientkm.SVCDESC = "Wificxsampleclientkm Service"
diff --git a/network/wlan/WIFICX/um/wificxsampleclientum.inf b/network/wlan/WIFICX/um/wificxsampleclientum.inf
index 41828dea..7b0b35ff 100644
--- a/network/wlan/WIFICX/um/wificxsampleclientum.inf
+++ b/network/wlan/WIFICX/um/wificxsampleclientum.inf
Binary files differ