]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dfu: add error callback
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Tue, 18 May 2021 13:12:12 +0000 (15:12 +0200)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 18 Jun 2021 08:09:41 +0000 (10:09 +0200)
Add error callback in dfu stack to manage some board specific
behavior on DFU targets.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
drivers/dfu/dfu.c
include/dfu.h

index 213a20e7bcb1b65377c6d66780989505ce8232d5..ff1859d946387ec5c8f4d2e7601dde8c522b482d 100644 (file)
@@ -44,6 +44,14 @@ __weak void dfu_initiated_callback(struct dfu_entity *dfu)
 {
 }
 
+/*
+ * The purpose of the dfu_error_callback() function is to
+ * provide callback for dfu user
+ */
+__weak void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
+{
+}
+
 /*
  * The purpose of the dfu_usb_get_reset() function is to
  * provide information if after USB_DETACH request
@@ -342,6 +350,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                printf("%s: Wrong sequence number! [%d] [%d]\n",
                       __func__, dfu->i_blk_seq_num, blk_seq_num);
                dfu_transaction_cleanup(dfu);
+               dfu_error_callback(dfu, "Wrong sequence number");
                return -1;
        }
 
@@ -366,6 +375,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                ret = dfu_write_buffer_drain(dfu);
                if (ret) {
                        dfu_transaction_cleanup(dfu);
+                       dfu_error_callback(dfu, "DFU write error");
                        return ret;
                }
        }
@@ -375,6 +385,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf,
                      size, dfu->i_buf_end);
                dfu_transaction_cleanup(dfu);
+               dfu_error_callback(dfu, "Buffer overflow");
                return -1;
        }
 
@@ -386,6 +397,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                ret = dfu_write_buffer_drain(dfu);
                if (ret) {
                        dfu_transaction_cleanup(dfu);
+                       dfu_error_callback(dfu, "DFU write error");
                        return ret;
                }
        }
index afada3959b72c0558551e891152bb4a6db96da7c..f6868982df70d6d6db9a61280f0b3aaaa972a8a1 100644 (file)
@@ -377,6 +377,17 @@ void dfu_initiated_callback(struct dfu_entity *dfu);
  */
 void dfu_flush_callback(struct dfu_entity *dfu);
 
+/**
+ * dfu_error_callback() - weak callback called at the DFU write error
+ *
+ * It is a callback function called by DFU stack after DFU write error.
+ * This function allows to manage some board specific behavior on DFU targets
+ *
+ * @dfu:       pointer to the dfu_entity which cause the error
+ * @msg:       the message of the error
+ */
+void dfu_error_callback(struct dfu_entity *dfu, const char *msg);
+
 int dfu_transaction_initiate(struct dfu_entity *dfu, bool read);
 void dfu_transaction_cleanup(struct dfu_entity *dfu);