master/soe_request.c
changeset 1864 0a6b3aacc847
parent 1843 4d44d8bee580
child 1907 dd276ae226b4
--- a/master/soe_request.c	Tue Mar 09 12:18:43 2010 +0100
+++ b/master/soe_request.c	Tue Mar 09 13:37:15 2010 +0100
@@ -172,6 +172,40 @@
 
 /*****************************************************************************/
 
+/** Copies SoE data from an external source.
+ *
+ * If the \a mem_size is to small, new memory is allocated.
+ *
+ * \retval  0 Success.
+ * \retval <0 Error code.
+ */
+int ec_soe_request_append_data(
+        ec_soe_request_t *req, /**< SoE request. */
+        const uint8_t *source, /**< Source data. */
+        size_t size /**< Number of bytes in \a source. */
+        )
+{
+    if (req->data_size + size > req->mem_size) {
+        size_t new_size = req->mem_size ? req->mem_size * 2 : size;
+        uint8_t *new_data = (uint8_t *) kmalloc(new_size, GFP_KERNEL);
+        if (!new_data) {
+            EC_ERR("Failed to allocate %zu bytes of SoE memory.\n",
+                    new_size);
+            return -ENOMEM;
+        }
+        memcpy(new_data, req->data, req->data_size);
+        kfree(req->data);
+        req->data = new_data;
+        req->mem_size = new_size;
+    }
+
+    memcpy(req->data + req->data_size, source, size);
+    req->data_size += size;
+    return 0;
+}
+
+/*****************************************************************************/
+
 void ec_soe_request_read(ec_soe_request_t *req)
 {
     req->dir = EC_DIR_INPUT;