WiFi-HAL: Write header and payload to same buffer

In case of driver prints and firmware prints, events will be
split into write to ring buffer as header and payload. Write
header and payload to same buffer so that complete record
will be available in a single buffer.

Bug:23783279
Change-Id: I54d3f813fbb14932b483cd6423d41c7187a464a9
diff --git a/qcwcn/wifi_hal/rb_wrapper.cpp b/qcwcn/wifi_hal/rb_wrapper.cpp
index 3a9b109..4c9e475 100644
--- a/qcwcn/wifi_hal/rb_wrapper.cpp
+++ b/qcwcn/wifi_hal/rb_wrapper.cpp
@@ -86,15 +86,15 @@
 }
 
 wifi_error ring_buffer_write(struct rb_info *rb_info, u8 *buf, size_t length,
-                             int no_of_records)
+                             int no_of_records, size_t record_length)
 {
     enum rb_status status;
 
-    status = rb_write(rb_info->rb_ctx, buf, length, 0);
+    status = rb_write(rb_info->rb_ctx, buf, length, 0, record_length);
     if ((status == RB_FULL) || (status == RB_RETRY)) {
          push_out_rb_data(rb_info);
          /* Try writing the data after reading it out */
-        status = rb_write(rb_info->rb_ctx, buf, length, 0);
+        status = rb_write(rb_info->rb_ctx, buf, length, 0, record_length);
         if (status != RB_SUCCESS) {
             ALOGE("Failed to rewrite %zu bytes to rb %s with error %d", length,
                   rb_info->name, status);
diff --git a/qcwcn/wifi_hal/rb_wrapper.h b/qcwcn/wifi_hal/rb_wrapper.h
index a0b6b1b..6160ebc 100644
--- a/qcwcn/wifi_hal/rb_wrapper.h
+++ b/qcwcn/wifi_hal/rb_wrapper.h
@@ -52,6 +52,6 @@
                             u32 flags, u32 max_interval_sec, u32 min_data_size);
 int is_rb_name_match(struct rb_info *rb_info, char *name);
 wifi_error ring_buffer_write(struct rb_info *rb_info, u8 *buf, size_t length,
-                             int no_of_records);
+                             int no_of_records, size_t record_length);
 void push_out_rb_data(void *cb_ctx);
 #endif /* __RB_WRAPPER_H */
diff --git a/qcwcn/wifi_hal/ring_buffer.cpp b/qcwcn/wifi_hal/ring_buffer.cpp
index fa90de1..790b007 100644
--- a/qcwcn/wifi_hal/ring_buffer.cpp
+++ b/qcwcn/wifi_hal/ring_buffer.cpp
@@ -146,14 +146,18 @@
     free(rbc);
 }
 
-enum rb_status rb_write (void *ctx, u8 *buf, size_t length, int overwrite)
+/*
+ * record_length : 0  - byte boundary
+ *               : >0 - Ensures to write record_length no.of bytes to the same buffer.
+ */
+enum rb_status rb_write (void *ctx, u8 *buf, size_t length, int overwrite,
+                         size_t record_length)
 {
     rbc_t *rbc = (rbc_t *)ctx;
     unsigned int bytes_written = 0; // bytes written into rb so far
     unsigned int push_in_rd_ptr = 0; // push required in read pointer because of
                                      // write in current buffer
     unsigned int total_push_in_rd_ptr = 0; // Total amount of push in read pointer in this write
-    size_t record_length = length;
 
     if (record_length > rbc->each_buf_size) {
         return RB_FAILURE;
diff --git a/qcwcn/wifi_hal/ring_buffer.h b/qcwcn/wifi_hal/ring_buffer.h
index d47f8d9..3a310b7 100644
--- a/qcwcn/wifi_hal/ring_buffer.h
+++ b/qcwcn/wifi_hal/ring_buffer.h
@@ -54,7 +54,8 @@
 void ring_buffer_deinit(void *ctx);
 
 /* Writes writes length of bytes from buf to ring buffer */
-enum rb_status rb_write(void *ctx, u8 *buf, size_t length, int overwrite);
+enum rb_status rb_write(void *ctx, u8 *buf, size_t length, int overwrite,
+                        size_t record_length);
 
 /* Tries to read max_length of bytes from ring buffer to buf
  * and returns actual length of bytes read from ring buffer
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index 65d78fd..d5d2346 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -101,7 +101,7 @@
     if (info->rb_infos[CONNECTIVITY_EVENTS_RB_ID].verbose_level >= 1 &&
         info->on_ring_buffer_data) {
         return ring_buffer_write(&info->rb_infos[CONNECTIVITY_EVENTS_RB_ID],
-                      (u8*)rbe, total_length, 1);
+                      (u8*)rbe, total_length, 1, total_length);
     }
 
     return WIFI_SUCCESS;
@@ -773,13 +773,15 @@
          * complete payload memcpy */
         status = ring_buffer_write(&info->rb_infos[FIRMWARE_PRINTS_RB_ID],
                                    (u8*)&rb_entry_hdr,
-                                   sizeof(wifi_ring_buffer_entry), 0);
+                                   sizeof(wifi_ring_buffer_entry),
+                                   0,
+                                   sizeof(wifi_ring_buffer_entry) + length);
         if (status != WIFI_SUCCESS) {
             ALOGE("Failed to write firmware prints rb header %d", status);
             return status;
         }
         status = ring_buffer_write(&info->rb_infos[FIRMWARE_PRINTS_RB_ID],
-                                   buf, length, 1);
+                                   buf, length, 1, length);
         if (status != WIFI_SUCCESS) {
             ALOGE("Failed to write firmware prints rb payload %d", status);
             return status;
@@ -1089,7 +1091,9 @@
         info->on_ring_buffer_data) {
         status = ring_buffer_write(&info->rb_infos[POWER_EVENTS_RB_ID],
                                    (u8*)pRingBufferEntry,
-                                   len_ring_buffer_entry, 1);
+                                   len_ring_buffer_entry,
+                                   1,
+                                   len_ring_buffer_entry);
     } else {
         status = WIFI_SUCCESS;
     }
@@ -1140,7 +1144,8 @@
         ring_buffer_write(&info->rb_infos[PKT_STATS_RB_ID],
                           (u8*)pRingBufferEntry,
                           size,
-                          num_records);
+                          num_records,
+                          size);
     }
 
     return WIFI_SUCCESS;
@@ -1733,13 +1738,15 @@
          * complete payload memcpy */
         status = ring_buffer_write(&info->rb_infos[DRIVER_PRINTS_RB_ID],
                                    (u8*)&rb_entry_hdr,
-                                   sizeof(wifi_ring_buffer_entry), 0);
+                                   sizeof(wifi_ring_buffer_entry),
+                                   0,
+                                   sizeof(wifi_ring_buffer_entry) + length);
         if (status != WIFI_SUCCESS) {
             ALOGE("Failed to write driver prints rb header %d", status);
             return status;
         }
         status = ring_buffer_write(&info->rb_infos[DRIVER_PRINTS_RB_ID],
-                                   buf, length, 1);
+                                   buf, length, 1, length);
         if (status != WIFI_SUCCESS) {
             ALOGE("Failed to write driver prints rb payload %d", status);
             return status;