static int download_tail(long long int left, int cnt) { struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(); int ret; debug("%s: left: %llu cnt: %d\n", __func__, left, cnt); if (left) { ret = dfu_write(dfu_entity, transfer_buffer, left, cnt++); if (ret) { error("DFU write failed [%d]: left: %llu", ret, left); return ret; } } /* * To store last "packet" or write file from buffer to filesystem * DFU storage backend requires dfu_flush * * This also frees memory malloc'ed by dfu_get_buf(), so no explicit * need fo call dfu_free_buf() is needed. */ ret = dfu_flush(dfu_entity, transfer_buffer, 0, cnt); if (ret) error("DFU flush failed!"); return ret; }
static long long int download_head(unsigned long long total, unsigned int packet_size, long long int *left, int *cnt) { long long int rcv_cnt = 0, left_to_rcv, ret_rcv; struct dfu_entity *dfu_entity = dfu_get_entity(alt_setting_num); void *transfer_buffer = dfu_get_buf(dfu_entity); void *buf = transfer_buffer; int usb_pkt_cnt = 0, ret; /* * Files smaller than THOR_STORE_UNIT_SIZE (now 32 MiB) are stored on * the medium. * The packet response is sent on the purpose after successful data * chunk write. There is a room for improvement when asynchronous write * is performed. */ while (total - rcv_cnt >= packet_size) { thor_set_dma(buf, packet_size); buf += packet_size; ret_rcv = thor_rx_data(); if (ret_rcv < 0) return ret_rcv; rcv_cnt += ret_rcv; debug("%d: RCV data count: %llu cnt: %d\n", usb_pkt_cnt, rcv_cnt, *cnt); if ((rcv_cnt % THOR_STORE_UNIT_SIZE) == 0) { ret = dfu_write(dfu_get_entity(alt_setting_num), transfer_buffer, THOR_STORE_UNIT_SIZE, (*cnt)++); if (ret) { error("DFU write failed [%d] cnt: %d", ret, *cnt); return ret; } buf = transfer_buffer; } send_data_rsp(0, ++usb_pkt_cnt); } /* Calculate the amount of data to arrive from PC (in bytes) */ left_to_rcv = total - rcv_cnt; /* * Calculate number of data already received. but not yet stored * on the medium (they are smaller than THOR_STORE_UNIT_SIZE) */ *left = left_to_rcv + buf - transfer_buffer; debug("%s: left: %llu left_to_rcv: %llu buf: 0x%p\n", __func__, *left, left_to_rcv, buf); if (left_to_rcv) { thor_set_dma(buf, packet_size); ret_rcv = thor_rx_data(); if (ret_rcv < 0) return ret_rcv; rcv_cnt += ret_rcv; send_data_rsp(0, ++usb_pkt_cnt); } debug("%s: %llu total: %llu cnt: %d\n", __func__, rcv_cnt, total, *cnt); return rcv_cnt; }