]> git.sur5r.net Git - u-boot/blobdiff - drivers/dfu/dfu_nand.c
pci: tegra: port to standard clock/reset/pwr domain APIs
[u-boot] / drivers / dfu / dfu_nand.c
index 4652541aeff8dd6bfcfc5dd0f3a6c9deded68416..9fb874c0bcd4f07c9ab1f6732117f4d7ed5a3c46 100644 (file)
@@ -39,12 +39,12 @@ static int nand_block_op(enum dfu_op op, struct dfu_entity *dfu,
 
        if (nand_curr_device < 0 ||
            nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
-           !nand_info[nand_curr_device].name) {
+           !nand_info[nand_curr_device]->name) {
                printf("%s: invalid nand device\n", __func__);
                return -1;
        }
 
-       mtd = &nand_info[nand_curr_device];
+       mtd = nand_info[nand_curr_device];
 
        if (op == DFU_OP_READ) {
                ret = nand_read_skip_bad(mtd, start, &count, &actual,
@@ -139,6 +139,7 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,
 static int dfu_flush_medium_nand(struct dfu_entity *dfu)
 {
        int ret = 0;
+       u64 off;
 
        /* in case of ubi partition, erase rest of the partition */
        if (dfu->data.nand.ubi) {
@@ -147,15 +148,24 @@ static int dfu_flush_medium_nand(struct dfu_entity *dfu)
 
                if (nand_curr_device < 0 ||
                    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
-                   !nand_info[nand_curr_device].name) {
+                   !nand_info[nand_curr_device]->name) {
                        printf("%s: invalid nand device\n", __func__);
                        return -1;
                }
 
-               mtd = &nand_info[nand_curr_device];
+               mtd = nand_info[nand_curr_device];
 
                memset(&opts, 0, sizeof(opts));
-               opts.offset = dfu->data.nand.start + dfu->offset +
+               off = dfu->offset;
+               if ((off & (mtd->erasesize - 1)) != 0) {
+                       /*
+                        * last write ended with unaligned length
+                        * sector is erased, jump to next
+                        */
+                       off = off & ~((mtd->erasesize - 1));
+                       off += mtd->erasesize;
+               }
+               opts.offset = dfu->data.nand.start + off +
                                dfu->bad_skip;
                opts.length = dfu->data.nand.start +
                                dfu->data.nand.size - opts.offset;