Ticket #1843: uboot-dfu-upload.patch

File uboot-dfu-upload.patch, 2.5 KB (added by laforge, 9 years ago)

proposed patch (tested, works for me, needs more testing)

  • drivers/usb/usbdfu.c

    diff --git a/drivers/usb/usbdfu.c b/drivers/usb/usbdfu.c
    index 933f587..855d12e 100644
    a b static int erase_tail_clean_nand(struct urb *urb, struct dnload_state *ds) 
    259259} 
    260260 
    261261/* Read the next erase blcok from NAND into buffer */ 
    262 static int read_next_nand(struct urb *urb, struct dnload_state *ds) 
     262static int read_next_nand(struct urb *urb, struct dnload_state *ds, int len) 
    263263{ 
    264264        struct usb_device_instance *dev = urb->device; 
    265265        int rc; 
    266266 
    267267        ds->read_opts.buffer = ds->buf; 
    268         ds->read_opts.length = ds->nand->erasesize; 
     268        ds->read_opts.length = len; 
    269269        ds->read_opts.offset = ds->off; 
    270270        ds->read_opts.quiet = 1; 
    271271 
    272         debug("Reading 0x%x@0x%x to 0x%08p\n", ds->nand->erasesize, 
    273                 ds->off, ds->buf); 
     272        debug("Reading 0x%x@0x%x to 0x%08p\n", len, ds->off, ds->buf); 
    274273        rc = nand_read_opts(ds->nand, &ds->read_opts); 
    275274        if (rc) { 
    276275                debug("Error reading\n"); 
    static int read_next_nand(struct urb *urb, struct dnload_state *ds) 
    278277                dev->dfu_status = DFU_STATUS_errWRITE; 
    279278                return RET_STALL; 
    280279        } 
    281         ds->off += ds->nand->erasesize; 
     280        ds->off += len; 
    282281        ds->ptr = ds->buf; 
    283282 
    284283        return RET_NOTHING; 
    static int handle_upload(struct urb *urb, u_int16_t val, u_int16_t len, int firs 
    498497                                return -EINVAL; 
    499498                        printf("Starting DFU Upload of partition '%s'\n", 
    500499                                ds->part->name); 
    501                         rc = read_next_nand(urb, ds); 
    502                         if (rc) 
    503                                 return -EINVAL; 
    504500                } 
    505501 
    506502                if (len > ds->nand->erasesize) { 
    static int handle_upload(struct urb *urb, u_int16_t val, u_int16_t len, int firs 
    509505                        len = ds->nand->erasesize; 
    510506                } 
    511507 
    512                 remain = ds->nand->erasesize - (ds->ptr - ds->buf); 
    513                 if (len < remain) 
    514                         remain = len; 
     508                /* limit length to whatever number of bytes is left in 
     509                 * this partition */ 
     510                remain = (ds->part->offset + ds->part->size) - ds->off; 
     511                if (len > remain) 
     512                        len = remain; 
    515513 
    516                 debug("copying %u bytes ", remain); 
    517                 urb->buffer = ds->ptr; 
    518                 ds->ptr += remain; 
    519                 urb->actual_length = remain; 
     514                rc = read_next_nand(urb, ds, len); 
     515                if (rc) 
     516                        return -EINVAL; 
    520517 
    521                 if (ds->ptr >= ds->buf + ds->nand->erasesize && 
    522                     ds->off < ds->part->offset + ds->part->size) { 
    523                         rc = read_next_nand(urb, ds); 
    524                         if (rc) 
    525                                 return -EINVAL; 
    526                         if (len > remain) { 
    527                                 debug("copying another %u bytes ", len - remain); 
    528                                 memcpy(urb->buffer + remain, ds->ptr, len - remain); 
    529                                 ds->ptr += (len - remain); 
    530                                 urb->actual_length += (len - remain); 
    531                         } 
    532                 } 
     518                debug("uploading %u bytes ", len); 
     519                urb->buffer = ds->buf; 
     520                urb->actual_length = len; 
    533521                break; 
    534522        } 
    535523