Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2017 Nordic Semiconductor ASA
 * Copyright (c) 2015 Runtime Inc
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <fs/fcb.h>
#include "fcb_priv.h"

/*
 * Call 'cb' for every element in flash circular buffer. If sector is specified,
 * only elements with that flash_sector are reported.
 */
int
fcb_walk(struct fcb *fcb, struct flash_sector *sector, fcb_walk_cb cb,
	 void *cb_arg)
{
	struct fcb_entry_ctx entry_ctx;
	int rc;

	entry_ctx.loc.fe_sector = sector;
	entry_ctx.loc.fe_elem_off = 0U;

	rc = k_mutex_lock(&fcb->f_mtx, K_FOREVER);
	if (rc < 0) {
		return -EINVAL;
	}
	while ((rc = fcb_getnext_nolock(fcb, &entry_ctx.loc)) !=
	       -ENOTSUP) {
		k_mutex_unlock(&fcb->f_mtx);
		if (sector && entry_ctx.loc.fe_sector != sector) {
			return 0;
		}

		entry_ctx.fap = fcb->fap;

		rc = cb(&entry_ctx, cb_arg);
		if (rc) {
			return rc;
		}
		rc = k_mutex_lock(&fcb->f_mtx, K_FOREVER);
		if (rc < 0) {
			return -EINVAL;
		}
	}
	k_mutex_unlock(&fcb->f_mtx);
	return 0;
}