From d4a1bd480003f3e1a0590bc46fbcb24f05652ca7 Mon Sep 17 00:00:00 2001 From: tzh <tanzhtanzh@gmail.com> Date: Thu, 15 Aug 2024 06:56:47 +0000 Subject: [PATCH] feat(wfit/bt): update aic8800 wifi/bt drive and hal --- android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 210 insertions(+), 9 deletions(-) diff --git a/android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp b/android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp index 7a38883..294002a 100755 --- a/android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp +++ b/android/hardware/aic/wlan/wifi_hal/wifi_logger.cpp @@ -59,9 +59,16 @@ LOGGER_START_PKT_FATE_MONITORING, LOGGER_GET_TX_PKT_FATES, LOGGER_GET_RX_PKT_FATES, + LOGGER_GET_WAKE_REASON_STATS, + LOGGER_DEBUG_GET_DUMP, + LOGGER_FILE_DUMP_DONE_IND, + LOGGER_SET_HAL_START, + LOGGER_HAL_STOP, + LOGGER_SET_HAL_PID } DEBUG_SUB_COMMAND; typedef enum { + LOGGER_ATTRIBUTE_INVALID = 0, LOGGER_ATTRIBUTE_DRIVER_VER, LOGGER_ATTRIBUTE_FW_VER, LOGGER_ATTRIBUTE_RING_ID, @@ -80,6 +87,8 @@ LOGGER_ATTRIBUTE_DRIVER_DUMP_DATA, LOGGER_ATTRIBUTE_PKT_FATE_NUM, LOGGER_ATTRIBUTE_PKT_FATE_DATA, + LOGGER_ATTRIBUTE_AFTER_LAST, + LOGGER_ATTRIBUTE_MAX = LOGGER_ATTRIBUTE_AFTER_LAST - 1, } LOGGER_ATTRIBUTE; typedef enum { @@ -105,6 +114,29 @@ RX_PACKET_FATE, } PktFateReqType; +enum wake_stat_attributes { + WAKE_STAT_ATTRIBUTE_TOTAL_CMD_EVENT, + WAKE_STAT_ATTRIBUTE_CMD_EVENT_WAKE, + WAKE_STAT_ATTRIBUTE_CMD_EVENT_COUNT, + WAKE_STAT_ATTRIBUTE_CMD_COUNT_USED, + WAKE_STAT_ATTRIBUTE_TOTAL_DRIVER_FW, + WAKE_STAT_ATTRIBUTE_DRIVER_FW_WAKE, + WAKE_STAT_ATTRIBUTE_DRIVER_FW_COUNT, + WAKE_STAT_ATTRIBUTE_DRIVER_FW_COUNT_USED, + WAKE_STAT_ATTRIBUTE_TOTAL_RX_DATA_WAKE, + WAKE_STAT_ATTRIBUTE_RX_UNICAST_COUNT, + WAKE_STAT_ATTRIBUTE_RX_MULTICAST_COUNT, + WAKE_STAT_ATTRIBUTE_RX_BROADCAST_COUNT, + WAKE_STAT_ATTRIBUTE_RX_ICMP_PKT, + WAKE_STAT_ATTRIBUTE_RX_ICMP6_PKT, + WAKE_STAT_ATTRIBUTE_RX_ICMP6_RA, + WAKE_STAT_ATTRIBUTE_RX_ICMP6_NA, + WAKE_STAT_ATTRIBUTE_RX_ICMP6_NS, + WAKE_STAT_ATTRIBUTE_IPV4_RX_MULTICAST_ADD_CNT, + WAKE_STAT_ATTRIBUTE_IPV6_RX_MULTICAST_ADD_CNT, + WAKE_STAT_ATTRIBUTE_OTHER__RX_MULTICAST_ADD_CNT, + WAKE_STAT_ATTRIBUTE_RX_MULTICAST_PKT_INFO +}; /////////////////////////////////////////////////////////////////////////////// class DebugCommand : public WifiCommand @@ -321,14 +353,30 @@ case GET_DRV_VER: case GET_FW_VER: { - void *data = reply.get_vendor_data(); + const struct nlattr *data = (const struct nlattr *)reply.get_vendor_data(); int len = reply.get_vendor_data_len(); + const struct nlattr *iter; + int rem, type, datalen; + ALOGD("len = %d, expected len = %d", len, *mBuffSize); - memcpy(mBuff, data, min(len, *mBuffSize)); - if (*mBuffSize < len) - return NL_SKIP; - *mBuffSize = len; + + nla_for_each_attr(iter, data, len, rem) { + type = nla_type(iter); + switch (type) { + case LOGGER_ATTRIBUTE_DRIVER_VER: + case LOGGER_ATTRIBUTE_FW_VER: + datalen = nla_len(iter); + if (datalen > *mBuffSize) + return NL_SKIP; + memcpy(mBuff, nla_data(iter), datalen); + ALOGD("WLAN %s version: %s", (type == LOGGER_ATTRIBUTE_DRIVER_VER) ? "Driver" : "Firmware", mBuff); + *mBuffSize = datalen; + break; + default: + return NL_SKIP; + } + } break; } @@ -378,11 +426,17 @@ case GET_FEATURE: { - void *data = reply.get_vendor_data(); - int len = reply.get_vendor_data_len(); + nlattr *data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA); - ALOGD("len = %d, expected len = %d", len, sizeof(unsigned int)); - memcpy(mSupport, data, sizeof(unsigned int)); + if (!mSupport) { + ALOGE("Buffers pointers not set"); + return NL_SKIP; + } + + nl_iterator it(data); + /* do not care it.get_type() */ + memcpy(mSupport, it.get_data(), min(it.get_len(), (int) sizeof(*mSupport))); + ALOGD("logger feature set: 0x%08X", *(int *)mSupport); break; } @@ -1075,6 +1129,143 @@ } }; +class GetWakeReasonCountCommand : public WifiCommand { + WLAN_DRIVER_WAKE_REASON_CNT *mWakeReasonCnt; + void *mCmdEventWakeCount; + public: + GetWakeReasonCountCommand(wifi_interface_handle handle, + WLAN_DRIVER_WAKE_REASON_CNT *wlanDriverWakeReasonCount) : + WifiCommand("GetWakeReasonCountCommand", handle, 0), + mWakeReasonCnt(wlanDriverWakeReasonCount) + { + mCmdEventWakeCount = mWakeReasonCnt->cmd_event_wake_cnt; + } + + int createRequest(WifiRequest& request) { + int result = request.create(GOOGLE_OUI, LOGGER_GET_WAKE_REASON_STATS); + if (result < 0) { + return result; + } + + nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); + + request.attr_end(data); + return WIFI_SUCCESS; + } + + int start() { + ALOGD("Start get wake stats command\n"); + WifiRequest request(familyId(), ifaceId()); + + int result = createRequest(request); + if (result < 0) { + ALOGE("Failed to create request result = %d\n", result); + return result; + } + + result = requestResponse(request); + if (result != WIFI_SUCCESS) { + ALOGE("Failed to register wake stats response; result = %d\n", result); + } + return result; + } + + protected: + int handleResponse(WifiEvent& reply) { + ALOGE("In GetWakeReasonCountCommand::handleResponse"); + + if (reply.get_cmd() != NL80211_CMD_VENDOR) { + ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); + return NL_SKIP; + } + + int id = reply.get_vendor_id(); + int subcmd = reply.get_vendor_subcmd(); + + nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA); + int len = reply.get_vendor_data_len(); + + ALOGV("Id = %0x, subcmd = %d, len = %d", id, subcmd, len); + if (vendor_data == NULL || len == 0) { + ALOGE("no vendor data in GetGetWakeReasonCountCommand response; ignoring it"); + return NL_SKIP; + } + + for (nl_iterator it(vendor_data); it.has_next(); it.next()) { + switch (it.get_type()) { + case WAKE_STAT_ATTRIBUTE_TOTAL_DRIVER_FW: + mWakeReasonCnt->total_driver_fw_local_wake = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_TOTAL_CMD_EVENT: + mWakeReasonCnt->total_cmd_event_wake = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_CMD_COUNT_USED: + mWakeReasonCnt->cmd_event_wake_cnt_used = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_CMD_EVENT_WAKE: + memcpy(mCmdEventWakeCount, it.get_data(), + (mWakeReasonCnt->cmd_event_wake_cnt_used * sizeof(int))); + break; + case WAKE_STAT_ATTRIBUTE_TOTAL_RX_DATA_WAKE: + mWakeReasonCnt->total_rx_data_wake = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_UNICAST_COUNT: + mWakeReasonCnt->rx_wake_details.rx_unicast_cnt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_MULTICAST_COUNT: + mWakeReasonCnt->rx_wake_details.rx_multicast_cnt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_BROADCAST_COUNT: + mWakeReasonCnt->rx_wake_details.rx_broadcast_cnt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_ICMP_PKT: + mWakeReasonCnt->rx_wake_pkt_classification_info.icmp_pkt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_ICMP6_PKT: + mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_pkt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_ICMP6_RA: + mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_ra = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_ICMP6_NA: + mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_na = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_RX_ICMP6_NS: + mWakeReasonCnt->rx_wake_pkt_classification_info.icmp6_ns = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_IPV4_RX_MULTICAST_ADD_CNT: + mWakeReasonCnt->rx_multicast_wake_pkt_info.ipv4_rx_multicast_addr_cnt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_IPV6_RX_MULTICAST_ADD_CNT: + mWakeReasonCnt->rx_multicast_wake_pkt_info.ipv6_rx_multicast_addr_cnt = + it.get_u32(); + break; + case WAKE_STAT_ATTRIBUTE_OTHER__RX_MULTICAST_ADD_CNT: + mWakeReasonCnt->rx_multicast_wake_pkt_info.other_rx_multicast_addr_cnt = + it.get_u32(); + break; + default: + break; + } + + } + return NL_OK; + } +}; + wifi_error wifi_start_pkt_fate_monitoring(wifi_interface_handle handle) { PacketFateCommand *cmd = new PacketFateCommand(handle); @@ -1107,3 +1298,13 @@ cmd->releaseRef(); return result; } + +wifi_error wifi_get_wake_reason_stats(wifi_interface_handle handle, + WLAN_DRIVER_WAKE_REASON_CNT *wifi_wake_reason_cnt) +{ + GetWakeReasonCountCommand *cmd = + new GetWakeReasonCountCommand(handle, wifi_wake_reason_cnt); + wifi_error result = (wifi_error)cmd->start(); + cmd->releaseRef(); + return result; +} -- Gitblit v1.6.2