]> git.sur5r.net Git - u-boot/blobdiff - drivers/dfu/dfu.c
dw_mmc: cleanups
[u-boot] / drivers / dfu / dfu.c
index 26d3b44e40f5b2640a223e0476daa037b550bd5a..55e6a83b9ad6956ccc1013bdb227d99d5f9ddfbc 100644 (file)
 #include <linux/list.h>
 #include <linux/compiler.h>
 
-static bool dfu_reset_request;
+static bool dfu_detach_request;
 static LIST_HEAD(dfu_list);
 static int dfu_alt_num;
 static int alt_num_cnt;
 static struct hash_algo *dfu_hash_algo;
 
-bool dfu_reset(void)
+/*
+ * The purpose of the dfu_usb_get_reset() function is to
+ * provide information if after USB_DETACH request
+ * being sent the dfu-util performed reset of USB
+ * bus.
+ *
+ * Described behaviour is the only way to distinct if
+ * user has typed -e (detach) or -R (reset) when invoking
+ * dfu-util command.
+ *
+ */
+__weak bool dfu_usb_get_reset(void)
 {
-       return dfu_reset_request;
+       return true;
 }
 
-void dfu_trigger_reset()
+bool dfu_detach(void)
 {
-       dfu_reset_request = true;
+       return dfu_detach_request;
+}
+
+void dfu_trigger_detach(void)
+{
+       dfu_detach_request = true;
+}
+
+void dfu_clear_detach(void)
+{
+       dfu_detach_request = false;
 }
 
 static int dfu_find_alt_num(const char *s)
@@ -82,7 +103,7 @@ unsigned long dfu_get_buf_size(void)
        return dfu_buf_size;
 }
 
-unsigned char *dfu_get_buf(void)
+unsigned char *dfu_get_buf(struct dfu_entity *dfu)
 {
        char *s;
 
@@ -92,6 +113,8 @@ unsigned char *dfu_get_buf(void)
        s = getenv("dfu_bufsiz");
        dfu_buf_size = s ? (unsigned long)simple_strtol(s, NULL, 16) :
                        CONFIG_SYS_DFU_DATA_BUF_SIZE;
+       if (dfu->max_buf_size && dfu_buf_size > dfu->max_buf_size)
+               dfu_buf_size = dfu->max_buf_size;
 
        dfu_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, dfu_buf_size);
        if (dfu_buf == NULL)
@@ -194,10 +217,10 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                dfu->offset = 0;
                dfu->bad_skip = 0;
                dfu->i_blk_seq_num = 0;
-               dfu->i_buf_start = dfu_get_buf();
+               dfu->i_buf_start = dfu_get_buf(dfu);
                if (dfu->i_buf_start == NULL)
                        return -ENOMEM;
-               dfu->i_buf_end = dfu_get_buf() + dfu_buf_size;
+               dfu->i_buf_end = dfu_get_buf(dfu) + dfu_buf_size;
                dfu->i_buf = dfu->i_buf_start;
 
                dfu->inited = 1;
@@ -318,7 +341,7 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
               __func__, dfu->name, buf, size, blk_seq_num, dfu->i_buf);
 
        if (!dfu->inited) {
-               dfu->i_buf_start = dfu_get_buf();
+               dfu->i_buf_start = dfu_get_buf(dfu);
                if (dfu->i_buf_start == NULL)
                        return -ENOMEM;
 
@@ -330,7 +353,7 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                case DFU_RAM_ADDR:
                        break;
                default:
-                       if (dfu->r_left >= dfu_buf_size) {
+                       if (dfu->r_left > dfu_buf_size) {
                                printf("%s: File too big for buffer\n",
                                       __func__);
                                return -EOVERFLOW;
@@ -342,7 +365,7 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
                dfu->i_blk_seq_num = 0;
                dfu->crc = 0;
                dfu->offset = 0;
-               dfu->i_buf_end = dfu_get_buf() + dfu_buf_size;
+               dfu->i_buf_end = dfu_get_buf(dfu) + dfu_buf_size;
                dfu->i_buf = dfu->i_buf_start;
                dfu->b_left = 0;
 
@@ -398,6 +421,8 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
        strcpy(dfu->name, st);
 
        dfu->alt = alt;
+       dfu->max_buf_size = 0;
+       dfu->free_entity = NULL;
 
        /* Specific for mmc device */
        if (strcmp(interface, "mmc") == 0) {
@@ -409,6 +434,9 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
        } else if (strcmp(interface, "ram") == 0) {
                if (dfu_fill_entity_ram(dfu, devstr, s))
                        return -1;
+       } else if (strcmp(interface, "sf") == 0) {
+               if (dfu_fill_entity_sf(dfu, devstr, s))
+                       return -1;
        } else {
                printf("%s: Device %s not (yet) supported!\n",
                       __func__,  interface);
@@ -424,6 +452,8 @@ void dfu_free_entities(void)
 
        list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) {
                list_del(&dfu->list);
+               if (dfu->free_entity)
+                       dfu->free_entity(dfu);
                t = dfu;
        }
        if (t)