Lines Matching +full:no +full:- +full:read +full:- +full:rollover
2 * dfu.c -- DFU back-end routines
7 * SPDX-License-Identifier: GPL-2.0+
28 * being sent the dfu-util performed reset of USB
32 * user has typed -e (detach) or -R (reset) when invoking
33 * dfu-util command.
68 return -EINVAL; in dfu_init_env_entities()
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()
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()
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()
193 if (dfu->i_buf_start == NULL) in dfu_transaction_initiate()
194 return -ENOMEM; in dfu_transaction_initiate()
196 dfu->i_buf_end = dfu->i_buf_start + dfu_get_buf_size(); in dfu_transaction_initiate()
198 if (read) { 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()
218 if (dfu->flush_medium) in dfu_flush()
219 ret = dfu->flush_medium(dfu); in dfu_flush()
222 printf("\nDFU complete %s: 0x%08x\n", dfu_hash_algo->name, in dfu_flush()
223 dfu->crc); in dfu_flush()
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()
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()
246 return -1; in dfu_write()
254 * This means that it's a 16 bit counter that roll-overs at in dfu_write()
255 * 0xffff -> 0x0000. By having a typical 4K transfer block in dfu_write()
256 * we roll-over at exactly 256MB. Not very fun to debug. in dfu_write()
258 * Handling rollover, and having an inited variable, in dfu_write()
262 /* handle rollover */ 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()
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()
279 return -1; 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()
304 /* get chunk that can be read */ in dfu_read_buffer_fill()
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()
310 dfu_hash_algo->hash_update(dfu_hash_algo, 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()
316 size -= chunk; in dfu_read_buffer_fill()
323 /* no more to read */ 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()
330 /* got to read, but buffer is empty */ 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()
336 debug("%s: Read error!\n", __func__); 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()
354 __func__, dfu->name, buf, size, blk_seq_num, dfu->i_buf); 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()
363 return -1; in dfu_read()
365 /* handle rollover */ in dfu_read()
366 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff; in dfu_read()
371 return -1; 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()
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()
402 return -1; in dfu_fill_entity()
405 return -1; in dfu_fill_entity()
408 return -1; in dfu_fill_entity()
411 return -1; in dfu_fill_entity()
414 return -1; in dfu_fill_entity()
418 return -1; in dfu_fill_entity()
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()
462 return -1; in dfu_config_entities()
470 return -1; in dfu_config_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()
516 if (dfu->alt == alt) in dfu_get_entity()
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()
535 * (/boot/bin/uImage) available at dfu->name when in dfu_get_alt()
543 str = strstr(dfu->name, name); in dfu_get_alt()
549 * dfu->name (uImage) 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()
557 return -ENODEV; in dfu_get_alt()
568 * has been properly initialized - e.g. if "dfu_bufsiz" has been taken in dfu_write_from_mem_addr()
587 left -= write; in dfu_write_from_mem_addr()