diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk index a3901f4647..3a27ed8001 100644 --- a/wifi/1.0/Android.mk +++ b/wifi/1.0/Android.mk @@ -1542,6 +1542,74 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (WifiDebugHostWakeReasonRxIcmpPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxIcmpPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxIcmpPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxMulticastPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxMulticastPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxMulticastPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonStats) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (WifiDebugPacketFateFrameInfo) # @@ -3769,6 +3837,74 @@ $(GEN): $(LOCAL_PATH)/types.hal $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) +# +# Build types.hal (WifiDebugHostWakeReasonRxIcmpPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxIcmpPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxIcmpPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxMulticastPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxMulticastPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxMulticastPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonRxPacketDetails) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonRxPacketDetails.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonRxPacketDetails + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (WifiDebugHostWakeReasonStats) +# +GEN := $(intermediates)/android/hardware/wifi/1.0/WifiDebugHostWakeReasonStats.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.wifi@1.0::types.WifiDebugHostWakeReasonStats + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + # # Build types.hal (WifiDebugPacketFateFrameInfo) # diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal index 487a5aefc1..3c085c345c 100644 --- a/wifi/1.0/IWifiChip.hal +++ b/wifi/1.0/IWifiChip.hal @@ -159,6 +159,10 @@ interface IWifiChip { * This mostly contains firmware event logs. */ DEBUG_RING_BUFFER_VENDOR_DATA_SUPPORTED = 1 << 5, + /** + * Host wake reasons stats collection. + */ + DEBUG_HOST_WAKE_REASON_STATS = 1 << 6, }; /** @@ -558,4 +562,22 @@ interface IWifiChip { * |WifiStatusCode.UNKNOWN| */ forceDumpToDebugRingBuffer(string ringName) generates (WifiStatus status); + + /** + * API to retrieve the wifi wake up reason stats for debugging. + * The driver is expected to start maintaining these stats once the chip + * is configured using |configureChip|. These stats must be reset whenever + * the chip is reconfigured or the HAL is stopped. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.NOT_AVAILABLE|, + * |WifiStatusCode.UNKNOWN| + * @return stats Instance of |WifiDebugHostWakeReasonStats|. + */ + getDebugHostWakeReasonStats() + generates (WifiStatus status, WifiDebugHostWakeReasonStats stats); }; diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal index 0c3a2119ef..066662c1f9 100644 --- a/wifi/1.0/types.hal +++ b/wifi/1.0/types.hal @@ -3063,3 +3063,110 @@ struct WifiDebugRxPacketFateReport { WifiDebugRxPacketFate fate; WifiDebugPacketFateFrameInfo frameInfo; }; + +/** + * Struct capturing the count of all rx packets that caused + * host wakeup. + */ +struct WifiDebugHostWakeReasonRxPacketDetails { + /** + * Total rx unicast packet which woke up host. + */ + uint32_t rxUnicastCnt; + /** + * Total rx multicast packet which woke up host. + */ + uint32_t rxMulticastCnt; + /** + * Total rx broadcast packet which woke up host. + */ + uint32_t rxBroadcastCnt; +}; + +/** + * Struct capturing the count of all rx multicast packets that caused + * host wakeup. + */ +struct WifiDebugHostWakeReasonRxMulticastPacketDetails { + /** + * Rx wake packet was ipv4 multicast. + */ + uint32_t ipv4RxMulticastAddrCnt; + /** + * Rx wake packet was ipv6 multicast. + */ + uint32_t ipv6RxMulticastAddrCnt; + /** + * Rx wake packet was non-ipv4 and non-ipv6. + */ + uint32_t otherRxMulticastAddrCnt; +}; + +/** + * Struct capturing the count of all rx ICMP packets that caused + * host wakeup. + */ +struct WifiDebugHostWakeReasonRxIcmpPacketDetails { + /** + * Wake icmp packet count. + */ + uint32_t icmpPkt; + /** + * Wake icmp6 packet count. + */ + uint32_t icmp6Pkt; + /** + * Wake icmp6 RA packet count. + */ + uint32_t icmp6Ra; + /** + * Wake icmp6 NA packet count. + */ + uint32_t icmp6Na; + /** + * Wake icmp6 NS packet count. + */ + uint32_t icmp6Ns; +}; + +/** + * Structure capturing the count of all the wireless related host wakeup. + * This is used to capture all the reasons why the host processor + * (WLAN driver) was woken up by the WLAN firmware. + * These stats may be used to debug any power issues caused due to frequent + * wakeup of the host processor by the WLAN firmware. + */ +struct WifiDebugHostWakeReasonStats { + /** + * Total count of cmd/event wakes. + * These must account for all wakeups due to WLAN management + * commands/events received over the air. + */ + uint32_t totalCmdEventWakeCnt; + /** + * Vector of wake counts per cmd/event type. + * The number of command types and their meaning is only understood by the + * vendor. + */ + vec cmdEventWakeCntPerType; + /** + * Total count of drive/fw wakes. + * These must account for all wakeups due to local driver/firmware + * interactions. These include all vendor implementation specific + * interactions like any heart-beat monitoring, Bus management, etc. + */ + uint32_t totalDriverFwLocalWakeCnt; + /** + * Vector of wake counts per driver/firmware interaction type. + * The number of command types and their meaning is only understood by the + * vendor. + */ + vec driverFwLocalWakeCntPerType; + /** + * Total data rx packets, that woke up host. + */ + uint32_t totalRxPacketWakeCnt; + WifiDebugHostWakeReasonRxPacketDetails rxPktWakeDetails; + WifiDebugHostWakeReasonRxMulticastPacketDetails rxMulticastPkWakeDetails; + WifiDebugHostWakeReasonRxIcmpPacketDetails rxIcmpPkWakeDetails; +};