Lines Matching refs:dfu

35 __weak void dfu_flush_callback(struct dfu_entity *dfu)  in dfu_flush_callback()  argument
43 __weak void dfu_initiated_callback(struct dfu_entity *dfu) in dfu_initiated_callback() argument
99 struct dfu_entity *dfu; in dfu_config_interfaces() local
111 ret = dfu_alt_init(n, &dfu); in dfu_config_interfaces()
129 ret = dfu_alt_add(dfu, i, d, part); in dfu_config_interfaces()
188 unsigned char *dfu_get_buf(struct dfu_entity *dfu) in dfu_get_buf() argument
193 if (dfu_buf && dfu->dev_type != dfu_buf_device_type) in dfu_get_buf()
206 if (dfu->max_buf_size && dfu_buf_size > dfu->max_buf_size) in dfu_get_buf()
207 dfu_buf_size = dfu->max_buf_size; in dfu_get_buf()
214 dfu_buf_device_type = dfu->dev_type; in dfu_get_buf()
235 static int dfu_write_buffer_drain(struct dfu_entity *dfu) in dfu_write_buffer_drain() argument
241 w_size = dfu->i_buf - dfu->i_buf_start; in dfu_write_buffer_drain()
246 dfu_hash_algo->hash_update(dfu_hash_algo, &dfu->crc, in dfu_write_buffer_drain()
247 dfu->i_buf_start, w_size, 0); in dfu_write_buffer_drain()
249 ret = dfu->write_medium(dfu, dfu->offset, dfu->i_buf_start, &w_size); in dfu_write_buffer_drain()
254 dfu->i_buf = dfu->i_buf_start; in dfu_write_buffer_drain()
257 dfu->offset += w_size; in dfu_write_buffer_drain()
264 void dfu_transaction_cleanup(struct dfu_entity *dfu) in dfu_transaction_cleanup() argument
267 dfu->crc = 0; in dfu_transaction_cleanup()
268 dfu->offset = 0; in dfu_transaction_cleanup()
269 dfu->i_blk_seq_num = 0; in dfu_transaction_cleanup()
270 dfu->i_buf_start = dfu_get_buf(dfu); in dfu_transaction_cleanup()
271 dfu->i_buf_end = dfu->i_buf_start; in dfu_transaction_cleanup()
272 dfu->i_buf = dfu->i_buf_start; in dfu_transaction_cleanup()
273 dfu->r_left = 0; in dfu_transaction_cleanup()
274 dfu->b_left = 0; in dfu_transaction_cleanup()
275 dfu->bad_skip = 0; in dfu_transaction_cleanup()
277 dfu->inited = 0; in dfu_transaction_cleanup()
280 int dfu_transaction_initiate(struct dfu_entity *dfu, bool read) in dfu_transaction_initiate() argument
284 if (dfu->inited) in dfu_transaction_initiate()
287 dfu_transaction_cleanup(dfu); in dfu_transaction_initiate()
289 if (dfu->i_buf_start == NULL) in dfu_transaction_initiate()
292 dfu->i_buf_end = dfu->i_buf_start + dfu_get_buf_size(); in dfu_transaction_initiate()
295 ret = dfu->get_medium_size(dfu, &dfu->r_left); in dfu_transaction_initiate()
298 debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left); in dfu_transaction_initiate()
301 dfu->inited = 1; in dfu_transaction_initiate()
302 dfu_initiated_callback(dfu); in dfu_transaction_initiate()
307 int dfu_flush(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_flush() argument
311 ret = dfu_write_buffer_drain(dfu); in dfu_flush()
315 if (dfu->flush_medium) in dfu_flush()
316 ret = dfu->flush_medium(dfu); in dfu_flush()
320 dfu->crc); in dfu_flush()
322 dfu_flush_callback(dfu); in dfu_flush()
324 dfu_transaction_cleanup(dfu); in dfu_flush()
329 int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_write() argument
334 __func__, dfu->name, buf, size, blk_seq_num, dfu->offset, in dfu_write()
335 (unsigned long)(dfu->i_buf - dfu->i_buf_start)); in dfu_write()
337 ret = dfu_transaction_initiate(dfu, false); in dfu_write()
341 if (dfu->i_blk_seq_num != blk_seq_num) { in dfu_write()
343 __func__, dfu->i_blk_seq_num, blk_seq_num); in dfu_write()
344 dfu_transaction_cleanup(dfu); in dfu_write()
362 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff; in dfu_write()
365 if ((dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
366 ret = dfu_write_buffer_drain(dfu); in dfu_write()
368 dfu_transaction_cleanup(dfu); in dfu_write()
374 if ((dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
375 pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf, in dfu_write()
376 size, dfu->i_buf_end); in dfu_write()
377 dfu_transaction_cleanup(dfu); in dfu_write()
381 memcpy(dfu->i_buf, buf, size); in dfu_write()
382 dfu->i_buf += size; in dfu_write()
385 if (size == 0 || (dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
386 ret = dfu_write_buffer_drain(dfu); in dfu_write()
388 dfu_transaction_cleanup(dfu); in dfu_write()
396 static int dfu_read_buffer_fill(struct dfu_entity *dfu, void *buf, int size) in dfu_read_buffer_fill() argument
404 chunk = min((long)size, dfu->b_left); in dfu_read_buffer_fill()
407 memcpy(buf, dfu->i_buf, chunk); in dfu_read_buffer_fill()
410 &dfu->crc, buf, in dfu_read_buffer_fill()
413 dfu->i_buf += chunk; in dfu_read_buffer_fill()
414 dfu->b_left -= chunk; in dfu_read_buffer_fill()
423 if (dfu->r_left == 0) in dfu_read_buffer_fill()
426 dfu->i_buf = dfu->i_buf_start; in dfu_read_buffer_fill()
427 dfu->b_left = dfu->i_buf_end - dfu->i_buf_start; in dfu_read_buffer_fill()
430 if (dfu->b_left > dfu->r_left) in dfu_read_buffer_fill()
431 dfu->b_left = dfu->r_left; in dfu_read_buffer_fill()
432 ret = dfu->read_medium(dfu, dfu->offset, dfu->i_buf, in dfu_read_buffer_fill()
433 &dfu->b_left); in dfu_read_buffer_fill()
438 if (dfu->b_left == 0) in dfu_read_buffer_fill()
440 dfu->offset += dfu->b_left; in dfu_read_buffer_fill()
441 dfu->r_left -= dfu->b_left; in dfu_read_buffer_fill()
450 int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_read() argument
455 __func__, dfu->name, buf, size, blk_seq_num, dfu->i_buf); in dfu_read()
457 ret = dfu_transaction_initiate(dfu, true); in dfu_read()
461 if (dfu->i_blk_seq_num != blk_seq_num) { in dfu_read()
463 __func__, dfu->i_blk_seq_num, blk_seq_num); in dfu_read()
467 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff; in dfu_read()
469 ret = dfu_read_buffer_fill(dfu, buf, size); in dfu_read()
477 debug("%s: %s %s: 0x%x\n", __func__, dfu->name, in dfu_read()
478 dfu_hash_algo->name, dfu->crc); in dfu_read()
481 dfu_transaction_cleanup(dfu); in dfu_read()
487 static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt, in dfu_fill_entity() argument
494 strcpy(dfu->name, st); in dfu_fill_entity()
496 dfu->alt = alt; in dfu_fill_entity()
497 dfu->max_buf_size = 0; in dfu_fill_entity()
498 dfu->free_entity = NULL; in dfu_fill_entity()
502 if (dfu_fill_entity_mmc(dfu, devstr, s)) in dfu_fill_entity()
505 if (dfu_fill_entity_mtd(dfu, devstr, s)) in dfu_fill_entity()
508 if (dfu_fill_entity_nand(dfu, devstr, s)) in dfu_fill_entity()
511 if (dfu_fill_entity_ram(dfu, devstr, s)) in dfu_fill_entity()
514 if (dfu_fill_entity_sf(dfu, devstr, s)) in dfu_fill_entity()
517 if (dfu_fill_entity_virt(dfu, devstr, s)) in dfu_fill_entity()
524 dfu_get_buf(dfu); in dfu_fill_entity()
531 struct dfu_entity *dfu, *p, *t = NULL; in dfu_free_entities() local
534 list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) { in dfu_free_entities()
535 list_del(&dfu->list); in dfu_free_entities()
536 if (dfu->free_entity) in dfu_free_entities()
537 dfu->free_entity(dfu); in dfu_free_entities()
538 t = dfu; in dfu_free_entities()
547 int dfu_alt_init(int num, struct dfu_entity **dfu) in dfu_alt_init() argument
563 *dfu = calloc(sizeof(struct dfu_entity), dfu_alt_num); in dfu_alt_init()
564 if (!*dfu) in dfu_alt_init()
570 int dfu_alt_add(struct dfu_entity *dfu, char *interface, char *devstr, char *s) in dfu_alt_add() argument
578 p_dfu = &dfu[alt_num_cnt]; in dfu_alt_add()
591 struct dfu_entity *dfu; in dfu_config_entities() local
595 ret = dfu_alt_init(dfu_find_alt_num(env), &dfu); in dfu_config_entities()
601 ret = dfu_alt_add(dfu, interface, devstr, s); in dfu_config_entities()
628 struct dfu_entity *dfu; in dfu_show_entities() local
632 list_for_each_entry(dfu, &dfu_list, list) { in dfu_show_entities()
634 dfu_get_dev_type(dfu->dev_type), dfu->alt, in dfu_show_entities()
635 dfu->name, dfu_get_layout(dfu->layout)); in dfu_show_entities()
646 struct dfu_entity *dfu; in dfu_get_entity() local
648 list_for_each_entry(dfu, &dfu_list, list) { in dfu_get_entity()
649 if (dfu->alt == alt) in dfu_get_entity()
650 return dfu; in dfu_get_entity()
658 struct dfu_entity *dfu; in dfu_get_alt() local
661 list_for_each_entry(dfu, &dfu_list, list) { in dfu_get_alt()
662 if (dfu->name[0] != '/') { in dfu_get_alt()
663 if (!strncmp(dfu->name, name, strlen(dfu->name))) in dfu_get_alt()
664 return dfu->alt; in dfu_get_alt()
676 str = strstr(dfu->name, name); in dfu_get_alt()
684 if (strlen(dfu->name) == in dfu_get_alt()
685 ((str - dfu->name) + strlen(name))) in dfu_get_alt()
686 return dfu->alt; in dfu_get_alt()
693 int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size) in dfu_write_from_mem_addr() argument
704 dfu_get_buf(dfu); in dfu_write_from_mem_addr()
713 ret = dfu_write(dfu, dp, write, i); in dfu_write_from_mem_addr()
723 ret = dfu_flush(dfu, NULL, 0, i); in dfu_write_from_mem_addr()