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