diff options
| author | Yang You (UU) <[email protected]> | 2025-11-20 11:45:37 -0800 |
|---|---|---|
| committer | Yang You (UU) <[email protected]> | 2025-11-20 11:45:37 -0800 |
| commit | dd61a12239a771573bc87117119eceb082b9762b (patch) | |
| tree | 217d018bd8e0132a97a7515a19e8674e9601b87c | |
| parent | 25de639a793266bde0116816b86f8ada28808186 (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.cpp | 24 | ||||
| -rw-r--r-- | network/wlan/WIFICX/drivercode/device.h | 1 | ||||
| -rw-r--r-- | network/wlan/WIFICX/drivercode/umkmfusion.h | 43 | ||||
| -rw-r--r-- | network/wlan/WIFICX/drivercode/wifihal.cpp | 15 | ||||
| -rw-r--r-- | network/wlan/WIFICX/drivercode/wifitransition.cpp | 8 | ||||
| -rw-r--r-- | network/wlan/WIFICX/km/wificxsampleclientkm.inf | 2 | ||||
| -rw-r--r-- | network/wlan/WIFICX/um/wificxsampleclientum.inf | bin | 6802 -> 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 Binary files differindex 41828dea..7b0b35ff 100644 --- a/network/wlan/WIFICX/um/wificxsampleclientum.inf +++ b/network/wlan/WIFICX/um/wificxsampleclientum.inf |
