Lines Matching refs:dfu

97 unsigned char *dfu_get_buf(struct dfu_entity *dfu)  in dfu_get_buf()  argument
111 if (dfu->max_buf_size && dfu_buf_size > dfu->max_buf_size) in dfu_get_buf()
112 dfu_buf_size = dfu->max_buf_size; in dfu_get_buf()
139 static int dfu_write_buffer_drain(struct dfu_entity *dfu) in dfu_write_buffer_drain() argument
145 w_size = dfu->i_buf - dfu->i_buf_start; in dfu_write_buffer_drain()
150 dfu_hash_algo->hash_update(dfu_hash_algo, &dfu->crc, in dfu_write_buffer_drain()
151 dfu->i_buf_start, w_size, 0); in dfu_write_buffer_drain()
153 ret = dfu->write_medium(dfu, dfu->offset, dfu->i_buf_start, &w_size); in dfu_write_buffer_drain()
158 dfu->i_buf = dfu->i_buf_start; in dfu_write_buffer_drain()
161 dfu->offset += w_size; in dfu_write_buffer_drain()
168 void dfu_transaction_cleanup(struct dfu_entity *dfu) in dfu_transaction_cleanup() argument
171 dfu->crc = 0; in dfu_transaction_cleanup()
172 dfu->offset = 0; in dfu_transaction_cleanup()
173 dfu->i_blk_seq_num = 0; in dfu_transaction_cleanup()
174 dfu->i_buf_start = dfu_get_buf(dfu); in dfu_transaction_cleanup()
175 dfu->i_buf_end = dfu->i_buf_start; in dfu_transaction_cleanup()
176 dfu->i_buf = dfu->i_buf_start; in dfu_transaction_cleanup()
177 dfu->r_left = 0; in dfu_transaction_cleanup()
178 dfu->b_left = 0; in dfu_transaction_cleanup()
179 dfu->bad_skip = 0; in dfu_transaction_cleanup()
181 dfu->inited = 0; in dfu_transaction_cleanup()
184 int dfu_transaction_initiate(struct dfu_entity *dfu, bool read) in dfu_transaction_initiate() argument
188 if (dfu->inited) in dfu_transaction_initiate()
191 dfu_transaction_cleanup(dfu); in dfu_transaction_initiate()
193 if (dfu->i_buf_start == NULL) in dfu_transaction_initiate()
196 dfu->i_buf_end = dfu->i_buf_start + dfu_get_buf_size(); in dfu_transaction_initiate()
199 ret = dfu->get_medium_size(dfu, &dfu->r_left); in dfu_transaction_initiate()
202 debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left); in dfu_transaction_initiate()
205 dfu->inited = 1; in dfu_transaction_initiate()
210 int dfu_flush(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_flush() argument
214 ret = dfu_write_buffer_drain(dfu); in dfu_flush()
218 if (dfu->flush_medium) in dfu_flush()
219 ret = dfu->flush_medium(dfu); in dfu_flush()
223 dfu->crc); in dfu_flush()
225 dfu_transaction_cleanup(dfu); in dfu_flush()
230 int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_write() argument
235 __func__, dfu->name, buf, size, blk_seq_num, dfu->offset, in dfu_write()
236 (unsigned long)(dfu->i_buf - dfu->i_buf_start)); in dfu_write()
238 ret = dfu_transaction_initiate(dfu, false); in dfu_write()
242 if (dfu->i_blk_seq_num != blk_seq_num) { in dfu_write()
244 __func__, dfu->i_blk_seq_num, blk_seq_num); in dfu_write()
245 dfu_transaction_cleanup(dfu); in dfu_write()
263 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff; in dfu_write()
266 if ((dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
267 ret = dfu_write_buffer_drain(dfu); in dfu_write()
269 dfu_transaction_cleanup(dfu); in dfu_write()
275 if ((dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
276 pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf, in dfu_write()
277 size, dfu->i_buf_end); in dfu_write()
278 dfu_transaction_cleanup(dfu); in dfu_write()
282 memcpy(dfu->i_buf, buf, size); in dfu_write()
283 dfu->i_buf += size; in dfu_write()
286 if (size == 0 || (dfu->i_buf + size) > dfu->i_buf_end) { in dfu_write()
287 ret = dfu_write_buffer_drain(dfu); in dfu_write()
289 dfu_transaction_cleanup(dfu); in dfu_write()
297 static int dfu_read_buffer_fill(struct dfu_entity *dfu, void *buf, int size) in dfu_read_buffer_fill() argument
305 chunk = min((long)size, dfu->b_left); in dfu_read_buffer_fill()
308 memcpy(buf, dfu->i_buf, chunk); in dfu_read_buffer_fill()
311 &dfu->crc, buf, in dfu_read_buffer_fill()
314 dfu->i_buf += chunk; in dfu_read_buffer_fill()
315 dfu->b_left -= chunk; in dfu_read_buffer_fill()
324 if (dfu->r_left == 0) in dfu_read_buffer_fill()
327 dfu->i_buf = dfu->i_buf_start; in dfu_read_buffer_fill()
328 dfu->b_left = dfu->i_buf_end - dfu->i_buf_start; in dfu_read_buffer_fill()
331 if (dfu->b_left > dfu->r_left) in dfu_read_buffer_fill()
332 dfu->b_left = dfu->r_left; in dfu_read_buffer_fill()
333 ret = dfu->read_medium(dfu, dfu->offset, dfu->i_buf, in dfu_read_buffer_fill()
334 &dfu->b_left); in dfu_read_buffer_fill()
339 dfu->offset += dfu->b_left; in dfu_read_buffer_fill()
340 dfu->r_left -= dfu->b_left; in dfu_read_buffer_fill()
349 int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num) in dfu_read() argument
354 __func__, dfu->name, buf, size, blk_seq_num, dfu->i_buf); in dfu_read()
356 ret = dfu_transaction_initiate(dfu, true); in dfu_read()
360 if (dfu->i_blk_seq_num != blk_seq_num) { in dfu_read()
362 __func__, dfu->i_blk_seq_num, blk_seq_num); in dfu_read()
366 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff; in dfu_read()
368 ret = dfu_read_buffer_fill(dfu, buf, size); in dfu_read()
376 debug("%s: %s %s: 0x%x\n", __func__, dfu->name, in dfu_read()
377 dfu_hash_algo->name, dfu->crc); in dfu_read()
380 dfu_transaction_cleanup(dfu); in dfu_read()
386 static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt, in dfu_fill_entity() argument
393 strcpy(dfu->name, st); in dfu_fill_entity()
395 dfu->alt = alt; in dfu_fill_entity()
396 dfu->max_buf_size = 0; in dfu_fill_entity()
397 dfu->free_entity = NULL; in dfu_fill_entity()
401 if (dfu_fill_entity_mmc(dfu, devstr, s)) in dfu_fill_entity()
404 if (dfu_fill_entity_mtd(dfu, devstr, s)) in dfu_fill_entity()
407 if (dfu_fill_entity_nand(dfu, devstr, s)) in dfu_fill_entity()
410 if (dfu_fill_entity_ram(dfu, devstr, s)) in dfu_fill_entity()
413 if (dfu_fill_entity_sf(dfu, devstr, s)) in dfu_fill_entity()
420 dfu_get_buf(dfu); in dfu_fill_entity()
427 struct dfu_entity *dfu, *p, *t = NULL; in dfu_free_entities() local
430 list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) { in dfu_free_entities()
431 list_del(&dfu->list); in dfu_free_entities()
432 if (dfu->free_entity) in dfu_free_entities()
433 dfu->free_entity(dfu); in dfu_free_entities()
434 t = dfu; in dfu_free_entities()
445 struct dfu_entity *dfu; in dfu_config_entities() local
460 dfu = calloc(sizeof(*dfu), dfu_alt_num); in dfu_config_entities()
461 if (!dfu) in dfu_config_entities()
466 ret = dfu_fill_entity(&dfu[i], s, alt_num_cnt, interface, in dfu_config_entities()
469 free(dfu); in dfu_config_entities()
473 list_add_tail(&dfu[i].list, &dfu_list); in dfu_config_entities()
495 struct dfu_entity *dfu; in dfu_show_entities() local
499 list_for_each_entry(dfu, &dfu_list, list) { in dfu_show_entities()
501 dfu_get_dev_type(dfu->dev_type), dfu->alt, in dfu_show_entities()
502 dfu->name, dfu_get_layout(dfu->layout)); in dfu_show_entities()
513 struct dfu_entity *dfu; in dfu_get_entity() local
515 list_for_each_entry(dfu, &dfu_list, list) { in dfu_get_entity()
516 if (dfu->alt == alt) in dfu_get_entity()
517 return dfu; in dfu_get_entity()
525 struct dfu_entity *dfu; in dfu_get_alt() local
528 list_for_each_entry(dfu, &dfu_list, list) { in dfu_get_alt()
529 if (dfu->name[0] != '/') { in dfu_get_alt()
530 if (!strncmp(dfu->name, name, strlen(dfu->name))) in dfu_get_alt()
531 return dfu->alt; in dfu_get_alt()
543 str = strstr(dfu->name, name); in dfu_get_alt()
551 if (strlen(dfu->name) == in dfu_get_alt()
552 ((str - dfu->name) + strlen(name))) in dfu_get_alt()
553 return dfu->alt; in dfu_get_alt()
560 int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size) in dfu_write_from_mem_addr() argument
571 dfu_get_buf(dfu); in dfu_write_from_mem_addr()
580 ret = dfu_write(dfu, dp, write, i); in dfu_write_from_mem_addr()
590 ret = dfu_flush(dfu, NULL, 0, i); in dfu_write_from_mem_addr()