wifi: Debug ring buffer data collection am: 48185b2a2d am: 06db08cfae am: f4966f0958
am: c8decf49fe

Change-Id: Ia48d625a95b2cf5056b4a783506a625b4fbf3438
diff --git a/wifi/1.0/Android.mk b/wifi/1.0/Android.mk
index 26f782e..bb8d144 100644
--- a/wifi/1.0/Android.mk
+++ b/wifi/1.0/Android.mk
@@ -1879,177 +1879,6 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
-# Build types.hal (WifiDebugRingEntryConnectivityEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryConnectivityEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryConnectivityEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventTlv)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlv.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlv
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventTlvType)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlvType.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlvType
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventType)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventType.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventType
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryFlags)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryFlags.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryFlags
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryHeader)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryHeader.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryHeader
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryPowerEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryPowerEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryPowerEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryVendorData)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryVendorData.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryVendorData
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryWakelockEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryWakelockEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryWakelockEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
 # Build types.hal (WifiDebugRxPacketFate)
 #
 GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFate.java
@@ -4421,177 +4250,6 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
-# Build types.hal (WifiDebugRingEntryConnectivityEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryConnectivityEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryConnectivityEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventTlv)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlv.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlv
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventTlvType)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventTlvType.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventTlvType
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryEventType)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryEventType.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryEventType
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryFlags)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryFlags.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryFlags
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryHeader)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryHeader.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryHeader
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryPowerEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryPowerEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryPowerEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryVendorData)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryVendorData.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryVendorData
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
-# Build types.hal (WifiDebugRingEntryWakelockEvent)
-#
-GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRingEntryWakelockEvent.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 \
-        -randroid.hidl:system/libhidl/transport \
-        android.hardware.wifi@1.0::types.WifiDebugRingEntryWakelockEvent
-
-$(GEN): $(LOCAL_PATH)/types.hal
-	$(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-#
 # Build types.hal (WifiDebugRxPacketFate)
 #
 GEN := $(intermediates)/android/hardware/wifi/V1_0/WifiDebugRxPacketFate.java
diff --git a/wifi/1.0/IWifiChip.hal b/wifi/1.0/IWifiChip.hal
index e903ced..72b2c32 100644
--- a/wifi/1.0/IWifiChip.hal
+++ b/wifi/1.0/IWifiChip.hal
@@ -558,7 +558,7 @@
    *   ring. The vebose level for each ring buffer can be specified in this API.
    * - During wifi operations, driver must periodically report per ring data to
    *   framework by invoking the
-   *   |IWifiChipEventCallback.onDebugRingBuffer<Type>EntriesAvailable| callback.
+   *   |IWifiChipEventCallback.onDebugRingBufferDataAvailable| callback.
    * - When capturing a bug report, framework must indicate to driver that all
    *   the data has to be uploaded urgently by calling
    *   |forceDumpToDebugRingBuffer|.
diff --git a/wifi/1.0/IWifiChipEventCallback.hal b/wifi/1.0/IWifiChipEventCallback.hal
index aff1e43..0d9e329 100644
--- a/wifi/1.0/IWifiChipEventCallback.hal
+++ b/wifi/1.0/IWifiChipEventCallback.hal
@@ -74,28 +74,11 @@
    * @return status Status of the corresponding ring buffer. This should
    *         contain the name of the ring buffer on which the data is
    *         available.
-   * @return entries Vector of debug ring buffer data entries. These
-   *         should be parsed based on the type of entry.
+   * @return data Raw bytes of data sent by the driver. Must be dumped
+   *         out to a bugreport and post processed.
    */
-  /** Connectivity event data callback */
-  oneway onDebugRingBufferConnectivityEventEntriesAvailable(
-      WifiDebugRingBufferStatus status,
-      vec<WifiDebugRingEntryConnectivityEvent> entries);
-
-  /** Power event data callback */
-  oneway onDebugRingBufferPowerEventEntriesAvailable(
-      WifiDebugRingBufferStatus status,
-      vec<WifiDebugRingEntryPowerEvent> entries);
-
-  /** Wakelock event data callback */
-  oneway onDebugRingBufferWakelockEventEntriesAvailable(
-      WifiDebugRingBufferStatus status,
-      vec<WifiDebugRingEntryWakelockEvent> entries);
-
-  /** Vendor data event data callback */
-  oneway onDebugRingBufferVendorDataEntriesAvailable(
-      WifiDebugRingBufferStatus status,
-      vec<WifiDebugRingEntryVendorData> entries);
+  oneway onDebugRingBufferDataAvailable(
+      WifiDebugRingBufferStatus status, vec<uint8_t> data);
 
   /**
    * Callback indicating that the chip has encountered a fatal error.
diff --git a/wifi/1.0/default/hidl_struct_util.h b/wifi/1.0/default/hidl_struct_util.h
index e4104e2..9086666 100644
--- a/wifi/1.0/default/hidl_struct_util.h
+++ b/wifi/1.0/default/hidl_struct_util.h
@@ -39,6 +39,9 @@
 // Chip conversion methods.
 bool convertLegacyFeaturesToHidlChipCapabilities(
     uint32_t legacy_logger_feature_set, uint32_t* hidl_caps);
+bool convertLegacyDebugRingBufferStatusToHidl(
+    const legacy_hal::wifi_ring_buffer_status& legacy_status,
+    WifiDebugRingBufferStatus* hidl_status);
 bool convertLegacyVectorOfDebugRingBufferStatusToHidl(
     const std::vector<legacy_hal::wifi_ring_buffer_status>& legacy_status_vec,
     std::vector<WifiDebugRingBufferStatus>* hidl_status_vec);
diff --git a/wifi/1.0/default/wifi_chip.cpp b/wifi/1.0/default/wifi_chip.cpp
index 87b47cb..e15178d 100644
--- a/wifi/1.0/default/wifi_chip.cpp
+++ b/wifi/1.0/default/wifi_chip.cpp
@@ -57,7 +57,8 @@
       legacy_hal_(legacy_hal),
       mode_controller_(mode_controller),
       is_valid_(true),
-      current_mode_id_(kInvalidModeId) {}
+      current_mode_id_(kInvalidModeId),
+      debug_ring_buffer_cb_registered_(false) {}
 
 void WifiChip::invalidate() {
   invalidateAndRemoveAllIfaces();
@@ -687,6 +688,10 @@
     WifiDebugRingBufferVerboseLevel verbose_level,
     uint32_t max_interval_in_sec,
     uint32_t min_data_size_in_bytes) {
+  WifiStatus status = registerDebugRingBufferCallback();
+  if (status.code != WifiStatusCode::SUCCESS) {
+    return status;
+  }
   legacy_hal::wifi_error legacy_status =
       legacy_hal_.lock()->startRingBufferLogging(
           ring_name,
@@ -700,6 +705,10 @@
 
 WifiStatus WifiChip::forceDumpToDebugRingBufferInternal(
     const hidl_string& ring_name) {
+  WifiStatus status = registerDebugRingBufferCallback();
+  if (status.code != WifiStatusCode::SUCCESS) {
+    return status;
+  }
   legacy_hal::wifi_error legacy_status =
       legacy_hal_.lock()->getRingBufferData(ring_name);
   return createWifiStatusFromLegacyError(legacy_status);
@@ -774,6 +783,42 @@
   }
   return createWifiStatus(WifiStatusCode::SUCCESS);
 }
+
+WifiStatus WifiChip::registerDebugRingBufferCallback() {
+  if (debug_ring_buffer_cb_registered_) {
+    return createWifiStatus(WifiStatusCode::SUCCESS);
+  }
+
+  android::wp<WifiChip> weak_ptr_this(this);
+  const auto& on_ring_buffer_data_callback = [weak_ptr_this](
+      const std::string& /* name */,
+      const std::vector<uint8_t>& data,
+      const legacy_hal::wifi_ring_buffer_status& status) {
+    const auto shared_ptr_this = weak_ptr_this.promote();
+    if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
+      LOG(ERROR) << "Callback invoked on an invalid object";
+      return;
+    }
+    WifiDebugRingBufferStatus hidl_status;
+    if (!hidl_struct_util::convertLegacyDebugRingBufferStatusToHidl(
+            status, &hidl_status)) {
+      LOG(ERROR) << "Error converting ring buffer status";
+      return;
+    }
+    for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
+      callback->onDebugRingBufferDataAvailable(hidl_status, data);
+    }
+  };
+  legacy_hal::wifi_error legacy_status =
+      legacy_hal_.lock()->registerRingBufferCallbackHandler(
+          on_ring_buffer_data_callback);
+
+  if (legacy_status == legacy_hal::WIFI_SUCCESS) {
+    debug_ring_buffer_cb_registered_ = true;
+  }
+  return createWifiStatusFromLegacyError(legacy_status);
+}
+
 }  // namespace implementation
 }  // namespace V1_0
 }  // namespace wifi
diff --git a/wifi/1.0/default/wifi_chip.h b/wifi/1.0/default/wifi_chip.h
index 373712c..938b180 100644
--- a/wifi/1.0/default/wifi_chip.h
+++ b/wifi/1.0/default/wifi_chip.h
@@ -174,6 +174,7 @@
   WifiStatus enableDebugErrorAlertsInternal(bool enable);
 
   WifiStatus handleChipConfiguration(ChipModeId mode_id);
+  WifiStatus registerDebugRingBufferCallback();
 
   ChipId chip_id_;
   std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_;
@@ -186,6 +187,10 @@
   std::vector<sp<WifiRttController>> rtt_controllers_;
   bool is_valid_;
   uint32_t current_mode_id_;
+  // The legacy ring buffer callback API has only a global callback
+  // registration mechanism. Use this to check if we have already
+  // registered a callback.
+  bool debug_ring_buffer_cb_registered_;
 
   DISALLOW_COPY_AND_ASSIGN(WifiChip);
 };
diff --git a/wifi/1.0/default/wifi_legacy_hal.cpp b/wifi/1.0/default/wifi_legacy_hal.cpp
index d65052e..3b99e60 100644
--- a/wifi/1.0/default/wifi_legacy_hal.cpp
+++ b/wifi/1.0/default/wifi_legacy_hal.cpp
@@ -761,7 +761,7 @@
 WifiLegacyHal::getRingBuffersStatus() {
   std::vector<wifi_ring_buffer_status> ring_buffers_status;
   ring_buffers_status.resize(kMaxRingBuffers);
-  uint32_t num_rings = 0;
+  uint32_t num_rings = kMaxRingBuffers;
   wifi_error status = global_func_table_.wifi_get_ring_buffers_status(
       wlan_interface_handle_, &num_rings, ring_buffers_status.data());
   CHECK(num_rings <= kMaxRingBuffers);
diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal
index 2da4d84..76c89e3 100644
--- a/wifi/1.0/types.hal
+++ b/wifi/1.0/types.hal
@@ -2359,468 +2359,6 @@
 typedef uint32_t WifiRingBufferId;
 
 /**
- * Mask of flags present in |WifiDebugRingEntryHeader.flags| field.
- */
-enum WifiDebugRingEntryFlags : uint8_t {
-  /**
-   * Set for binary entries
-   */
-  HAS_BINARY = 1 << 0,
-  /**
-   * Set if 64 bits timestamp is present
-   */
-  HAS_TIMESTAMP = 1 << 1,
-};
-
-/**
- * This structure represent an entry within a debug ring buffer.
- * Wifi driver are responsible to manage the debug ring buffer and write the
- * debug information into those buffer.
- *
- * In general, the debug entries can be used to store meaningful 802.11
- * information (SME, MLME, connection and packet statistics) as well as vendor
- * proprietary data that is specific to a specific driver or chipset.
- * Binary entries can be used so as to store packet data or vendor specific
- * information and will be treated as blobs of data by android framework.
- *
- * A user land process will be started by framework so as to periodically
- * retrieve the data logged by drivers into their debug ring buffer, store the
- * data into log files and include the logs into android bugreports.
- */
-struct WifiDebugRingEntryHeader {
-  /**
-   * The size of |payload| excluding the header.
-   */
-  uint16_t sizeInBytes;
-  /**
-   * Combination of |WifiDebugRingEntryFlags| values.
-   */
-  uint8_t flags;
-  /**
-   * Present if |HAS_TIMESTAMP| bit is set.
-   */
-  TimeStampInUs timestamp;
-};
-
-/**
- * Below event types are used for both the connect and power event
- * ring entries.
- */
-enum WifiDebugRingEntryEventType : uint16_t {
-  /**
-   * Driver receives association command from kernel.
-   */
-  ASSOCIATION_REQUESTED = 0,
-  AUTH_COMPLETE = 1,
-  ASSOC_COMPLETE = 2,
-  /**
-   * Firmware event indicating auth frames are sent.
-   */
-  FW_AUTH_STARTED = 3,
-  /**
-   * Firmware event indicating assoc frames are sent.
-   */
-  FW_ASSOC_STARTED = 4,
-  /**
-   * Firmware event indicating reassoc frames are sent.
-   */
-  FW_RE_ASSOC_STARTED = 5,
-  DRIVER_SCAN_REQUESTED = 6,
-  DRIVER_SCAN_RESULT_FOUND = 7,
-  DRIVER_SCAN_COMPLETE = 8,
-  BACKGROUND_SCAN_STARTED = 9,
-  BACKGROUND_SCAN_COMPLETE = 10,
-  DISASSOCIATION_REQUESTED = 11,
-  RE_ASSOCIATION_REQUESTED = 12,
-  ROAM_REQUESTED = 13,
-  /**
-   * Received beacon from AP (event enabled  only in verbose mode).
-   */
-  BEACON_RECEIVED = 14,
-  /**
-   * Firmware has triggered a roam scan (not g-scan).
-   */
-  ROAM_SCAN_STARTED = 15,
-  /**
-   * Firmware has completed a roam scan (not g-scan).
-   */
-  ROAM_SCAN_COMPLETE = 16,
-  /**
-   * Firmware has started searching for roam candidates (with reason =xx).
-   */
-  ROAM_SEARCH_STARTED = 17,
-  /**
-   * Firmware has stopped searching for roam candidates (with reason =xx).
-   */
-  ROAM_SEARCH_STOPPED = 18,
-  /**
-   * Received channel switch anouncement from AP.
-   */
-  CHANNEL_SWITCH_ANOUNCEMENT = 20,
-  /**
-   * Firmware start transmit eapol frame, with  EAPOL index 1-4.
-   */
-  FW_EAPOL_FRAME_TRANSMIT_START = 21,
-  /**
-   * Firmware gives up eapol frame, with rate, success/failure and number
-   * retries.
-   */
-  FW_EAPOL_FRAME_TRANSMIT_STOP = 22,
-  /**
-   * Kernel queue EAPOL for transmission  in driver with EAPOL index 1-4.
-   */
-  DRIVER_EAPOL_FRAME_TRANSMIT_REQUESTED = 23,
-  /**
-   * With rate, regardless of the fact that EAPOL frame is accepted or
-   * rejected by firmware.
-   */
-  FW_EAPOL_FRAME_RECEIVED = 24,
-  /**
-   * With rate, and eapol index, driver has received EAPOL frame and will
-   * queue it up to wpa_supplicant.
-   */
-  DRIVER_EAPOL_FRAME_RECEIVED = 26,
-  /**
-   * With success/failure, parameters
-   */
-  BLOCK_ACK_NEGOTIATION_COMPLETE = 27,
-  BT_COEX_BT_SCO_START = 28,
-  BT_COEX_BT_SCO_STOP = 29,
-  /**
-   * For paging/scan etc., when BT starts transmiting twice per BT slot.
-   */
-  BT_COEX_BT_SCAN_START = 30,
-  BT_COEX_BT_SCAN_STOP = 31,
-  BT_COEX_BT_HID_START = 32,
-  BT_COEX_BT_HID_STOP = 33,
-  /**
-   * Firmware sends auth frame in roaming to next candidate.
-   */
-  ROAM_AUTH_STARTED = 34,
-  /**
-   * Firmware receive auth confirm from ap
-   */
-  ROAM_AUTH_COMPLETE = 35,
-  /**
-   * Firmware sends assoc/reassoc frame in roaming to next candidate.
-   */
-  ROAM_ASSOC_STARTED = 36,
-  /**
-   * Firmware receive assoc/reassoc confirm from ap.
-   */
-  ROAM_ASSOC_COMPLETE = 37,
-  /**
-   * Firmware sends stop BACKGROUND_SCAN
-   */
-  BACKGROUND_SCAN_STOP = 38,
-  /**
-   * Firmware indicates BACKGROUND_SCAN scan cycle started.
-   */
-  BACKGROUND_SCAN_CYCLE_STARTED = 39,
-  /**
-   * Firmware indicates BACKGROUND_SCAN scan cycle completed.
-   */
-  BACKGROUND_SCAN_CYCLE_COMPLETED = 40,
-  /**
-   * Firmware indicates BACKGROUND_SCAN scan start for a particular bucket.
-   */
-  BACKGROUND_SCAN_BUCKET_STARTED = 41,
-  /**
-   * Firmware indicates BACKGROUND_SCAN scan completed for for a particular bucket.
-   */
-  BACKGROUND_SCAN_BUCKET_COMPLETED = 42,
-  /**
-   * Event received from firmware about BACKGROUND_SCAN scan results being available.
-   */
-  BACKGROUND_SCAN_RESULTS_AVAILABLE = 43,
-  /**
-   * Event received from firmware with BACKGROUND_SCAN capabilities.
-   */
-  BACKGROUND_SCAN_CAPABILITIES = 44,
-  /**
-   * Event received from firmware when eligible candidate is found.
-   */
-  ROAM_CANDIDATE_FOUND = 45,
-  /**
-   * Event received from firmware when roam scan configuration gets
-   * enabled or disabled.
-   */
-  ROAM_SCAN_CONFIG = 46,
-  /**
-   * Firmware/driver timed out authentication.
-   */
-  AUTH_TIMEOUT = 47,
-  /**
-   * Firmware/driver timed out association.
-   */
-  ASSOC_TIMEOUT = 48,
-  /**
-   * Firmware/driver encountered allocation failure.
-   */
-  MEM_ALLOC_FAILURE = 49,
-  /**
-   * Driver added a PNO network in firmware.
-   */
-  DRIVER_PNO_ADD = 50,
-  /**
-   * Driver removed a PNO network in firmware.
-   */
-  DRIVER_PNO_REMOVE = 51,
-  /**
-   * Driver received PNO networks found indication from firmware.
-   */
-  DRIVER_PNO_NETWORK_FOUND = 52,
-  /**
-   * Driver triggered a scan for PNO networks.
-   */
-  DRIVER_PNO_SCAN_REQUESTED = 53,
-  /**
-   * Driver received scan results  of PNO networks.
-   */
-  DRIVER_PNO_SCAN_RESULT_FOUND = 54,
-  /**
-   * Driver updated scan results from  PNO networks to cfg80211.
-   */
-  DRIVER_PNO_SCAN_COMPLETE = 55,
-};
-
-/**
- * Parameters of the various events are a sequence of TLVs
- * (type, length, value). The types for different TLV's are defined below.
- */
-enum WifiDebugRingEntryEventTlvType : uint16_t {
-  /**
-   * Take a byte stream as parameter.
-   */
-  VENDOR_SPECIFIC = 0,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  BSSID = 1,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  ADDR = 2,
-  /**
-   * Takes an SSID as parameter.
-   */
-  SSID = 3,
-  /**
-   * Takes an integer as parameter.
-   */
-  STATUS = 4,
-  /**
-   * Takes a |WifiChannelInfo| struct as parameter.
-   */
-  CHANNEL_SPEC = 5,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  ADDR_1 = 6,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  ADDR_2 = 7,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  ADDR_3 = 8,
-  /**
-   * Takes a MAC address as parameter.
-   */
-  ADDR_4 = 9,
-  /**
-   * Takes a TSF value as parameter.
-   */
-  TSF = 10,
-  /**
-   * Takes one or more specific 802.11 IEs parameter IEs are in turn
-   * indicated in TLV format as per 802.11, spec.
-   */
-  IE = 11,
-  /**
-   * Takes a string interface name as parameter.
-   */
-  IFACE_NAME = 12,
-  /**
-   * Takes a integer reason code as per 802.11 as parameter.
-   */
-  REASON_CODE = 13,
-  /**
-   * Takes an integer representing wifi rate in 1 mbps as parameter.
-   */
-  RATE_MBPS = 14,
-  /**
-   * Takes an integer as parameter.
-   */
-  REQUEST_ID = 15,
-  /**
-   * Takes an integer as parameter.
-   */
-  BUCKET_ID = 16,
-  /**
-   * Takes a |BackgroundScanParameters| struct as parameter.
-   */
-  BACKGROUND_SCAN_PARAMS = 17,
-  /**
-   * Takes a |BackgroundScanCapabilities| struct as parameter.
-   */
-  BACKGROUND_SCAN_CAPABILITIES = 18,
-  /**
-   * Takes an integer as parameter.
-   */
-  SCAN_ID = 19,
-  /**
-   * Takes an integer as parameter.
-   */
-  RSSI = 20,
-  /**
-   * Takes a |WifiChannelInMhz| as parameter.
-   */
-  CHANNEL = 21,
-  /**
-   * Takes an integer as parameter.
-   */
-  LINK_ID = 22,
-  /**
-   * Takes an integer as parameter.
-   */
-  LINK_ROLE = 23,
-  /**
-   * Takes an integer as parameter.
-   */
-  LINK_STATE = 24,
-  /**
-   * Takes an integer as parameter.
-   */
-  LINK_TYPE = 25,
-  /**
-   * Takes an integer as parameter.
-   */
-  TSCO = 26,
-  /**
-   * Takes an integer as parameter.
-   */
-  RSCO = 27,
-  /**
-   * Takes an integer as parameter.
-   * M1=1, M2=2, M3=3, M=4,
-   */
-  EAPOL_MESSAGE_TYPE = 28,
-};
-
-/**
- * Used to describe a specific TLV in an event entry.
- */
-struct WifiDebugRingEntryEventTlv {
-  WifiDebugRingEntryEventTlvType type;
-  /**
-   * All possible types of values that can be held in the TLV.
-   * Note: This should ideally be a union. But, since this HIDL package
-   * is going to be used by a java client, we cannot have unions in this
-   * package.
-   */
-  /* TODO(b/32207606): This can be moved to vendor extension. */
-  vec<uint8_t> vendorSpecific;
-  Bssid bssid;
-  MacAddress addr;
-  Ssid ssid;
-  WifiChannelInfo channelSpec;
-  uint64_t tsf;
-  vec<WifiInformationElement> ie;
-  string ifaceName;
-  StaBackgroundScanParameters bgScanParams;
-  StaBackgroundScanCapabilities bgScanCapabilities;
-  Rssi rssi;
-  WifiChannelInMhz channel;
-  uint32_t integerVal;
-};
-
-/**
- * Used to describe a connect event ring entry.
- */
-struct WifiDebugRingEntryConnectivityEvent {
-  /**
-   * Ring entry header.
-   */
-  WifiDebugRingEntryHeader header;
-  /**
-   * Type of connection event.
-   */
-  WifiDebugRingEntryEventType event;
-  /**
-   * Separate parameter structure per event to be provided and optional data.
-   * The event data is expected to include an official android part, with some
-   * parameter as transmit rate, num retries, num scan result found, etc.
-   * event data can include a vendor proprietary part which is understood by
-   * the vendor only.
-   */
-  vec<WifiDebugRingEntryEventTlv> tlvs;
-};
-
-/**
- * Used to describe a power event ring entry.
- */
-struct WifiDebugRingEntryPowerEvent {
-  /**
-   * Ring entry header.
-   */
-  WifiDebugRingEntryHeader header;
-  /**
-   * Type of power event.
-   */
-  WifiDebugRingEntryEventType event;
-  /**
-   * Separate parameter structure per event to be provided and optional data.
-   * The event data is expected to include an official android part, with some
-   * parameter as transmit rate, num retries, num scan result found, etc.
-   * event data can include a vendor proprietary part which is understood by
-   * the vendor only.
-   */
-  vec<WifiDebugRingEntryEventTlv> tlvs;
-};
-
-/**
- * Used to describe a wakelock event ring entry.
- */
-struct WifiDebugRingEntryWakelockEvent {
-  /**
-   * Ring entry header.
-   */
-  WifiDebugRingEntryHeader header;
-  /**
-   * true = wake lock acquired.
-   * false = wake lock released.
-   */
-  bool wasAcquired;
-  /**
-   * Reason why this wake lock is taken.
-   * This is a vendor defined reason and can only be understood by the
-   * vendor.
-   */
-  uint32_t vendorSpecificReason;
-  /**
-   * Wake lock name.
-   */
-  string wakelockName;
-};
-
-/**
- * Used to describe a vendor specific data ring entry.
- */
-struct WifiDebugRingEntryVendorData {
-  /**
-   * Ring entry header.
-   */
-  WifiDebugRingEntryHeader header;
-  /**
-   * This is a blob that will only be understood by the
-   * vendor.
-   */
-  vec<uint8_t> vendorData;
-};
-
-/**
  * Flags describing each debug ring buffer.
  */
 enum WifiDebugRingBufferFlags : uint32_t {