aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Kocialkowski2016-02-03 21:06:23 +0100
committerPaul Kocialkowski2016-02-03 21:06:23 +0100
commitd58ef632fb361620b59ec2886bf1d03f7a9c0799 (patch)
tree1108f8ad6f3abc63a96a32ae0bd5b37f3138539e
parent331ba82a08867b1a93b6d8178958df5068e6029f (diff)
Async write requests for bigger transfer sizes
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
-rw-r--r--src/download.c26
-rw-r--r--src/download.h9
-rw-r--r--src/lg-downloader.c2
3 files changed, 36 insertions, 1 deletions
diff --git a/src/download.c b/src/download.c
index b810a91..21df17d 100644
--- a/src/download.c
+++ b/src/download.c
@@ -195,6 +195,32 @@ int download_ready_read(struct context *context, off_t address, size_t length)
return 0;
}
+int download_write_async(struct context *context, void *buffer, size_t length)
+{
+ struct download_write_async_request request;
+ struct download_response response;
+ int rc;
+
+ memset(&request, 0, sizeof(request));
+ request.command = DOWNLOAD_WRITE_ASYNC;
+ request.total_length = htole32(length);
+ request.length = htole32(length);
+
+ rc = hdlc_send(context, &request, sizeof(request));
+ if (rc < 0)
+ return -1;
+
+ rc = download_response(context);
+ if (rc < 0)
+ return -1;
+
+ rc = usb_send(context, buffer, length);
+ if (rc < 0)
+ return -1;
+
+ return 0;
+}
+
int download_reset(struct context *context)
{
int rc;
diff --git a/src/download.h b/src/download.h
index fc215a6..c1554cb 100644
--- a/src/download.h
+++ b/src/download.h
@@ -93,6 +93,14 @@ struct download_ready_read_request {
uint32_t length;
} __attribute__((__packed__));
+struct download_write_async_request {
+ uint8_t command;
+ uint8_t binary_type;
+ uint16_t reserved;
+ uint32_t total_length;
+ uint32_t length;
+} __attribute__((__packed__));
+
struct download_response {
uint8_t ack;
} __attribute__((__packed__));
@@ -107,6 +115,7 @@ int download_erase(struct context *context, off_t address, size_t length);
int download_read(struct context *context, void *buffer, size_t length);
int download_initialize_partition(struct context *context, off_t address, size_t length);
int download_ready_read(struct context *context, off_t address, size_t length);
+int download_write_async(struct context *context, void *buffer, size_t length);
int download_reset(struct context *context);
int download_notify_start_dl(struct context *context);
diff --git a/src/lg-downloader.c b/src/lg-downloader.c
index d9cfd3a..8e1e6a6 100644
--- a/src/lg-downloader.c
+++ b/src/lg-downloader.c
@@ -190,7 +190,7 @@ int flash(struct context *context)
p += rc;
}
- rc = download_write(context, buffer, address, GPT_BLOCK_SIZE);
+ rc = download_write_async(context, buffer, GPT_BLOCK_SIZE);
if (rc < 0)
goto error;