@@ -36,6 +36,11 @@ static struct fcb trace_fcb = {
3636 .f_flags = FCB_FLAGS_CRC_DISABLED ,
3737};
3838
39+ /* Flash backend needs to wait for a sector to be cleared and will give the semaphore instead.
40+ * This should be cleaned up with a separate API, but we declare the semaphore as extern for now.
41+ */
42+ extern struct k_sem trace_clear_sem ;
43+
3944/* Store in __noinit RAM to perserve in warm boot. */
4045static __noinit uint32_t magic ;
4146static __noinit size_t read_offset ;
@@ -116,8 +121,10 @@ static int buffer_flush_to_flash(void)
116121 }
117122
118123 if (err ) {
119- LOG_ERR ("fcb_append failed, err %d" , err );
120- err = - ENOSPC ;
124+ if (err != - ENOSPC ) {
125+ LOG_ERR ("fcb_append failed, err %d" , err );
126+ }
127+
121128 goto out ;
122129 }
123130 }
@@ -189,14 +196,16 @@ int trace_backend_init(trace_backend_processed_cb trace_processed_cb)
189196
190197 /* After a cold boot the magic will contain random values. */
191198 if (magic != TRACE_MAGIC_INITIALIZED ) {
192- LOG_DBG ("Initializing " );
199+ LOG_DBG ("Trace magic not found, initializing " );
193200 read_offset = 0 ;
194201 trace_bytes_unread = 0 ;
195202 flash_buf_written = 0 ;
196203 memset (& loc , 0 , sizeof (loc ));
197204 sector = NULL ;
198205 magic = TRACE_MAGIC_INITIALIZED ;
199206 trace_flash_erase ();
207+ } else {
208+ LOG_DBG ("Trace magic found, skipping initialization" );
200209 }
201210
202211 uint32_t f_sector_cnt = sizeof (trace_flash_sectors ) / sizeof (struct flash_sector );
@@ -266,6 +275,7 @@ static int read_from_offset(void *buf, size_t len)
266275int trace_backend_read (void * buf , size_t len )
267276{
268277 int err ;
278+ size_t ret ;
269279 size_t to_read = 0 ;
270280
271281 if (!is_initialized ) {
@@ -314,25 +324,32 @@ int trace_backend_read(void *buf, size_t len)
314324 err = read_from_offset (buf , len );
315325
316326out :
327+ ret = err ;
328+
317329 /* Erase if done with previous sector. */
318330 if (sector && (sector != loc .fe_sector )) {
319331 err = fcb_rotate (& trace_fcb );
320332 if (err ) {
333+ LOG_ERR ("Failed to erase read sector, err %d" , err );
321334 k_sem_give (& fcb_sem );
322- return err ;
335+ /* Return what we have read */
336+ return ret ;
323337 }
338+
339+ k_sem_give (& trace_clear_sem );
324340 }
325341
326342 sector = loc .fe_sector ;
327343
328344 k_sem_give (& fcb_sem );
329- return err ;
345+ return ret ;
330346}
331347
332348static int stream_write (const void * buf , size_t len )
333349{
334350 int ret ;
335351 int written ;
352+ size_t written_total = 0 ;
336353 size_t bytes_left = len ;
337354 const uint8_t * bytes = buf ;
338355
@@ -342,36 +359,47 @@ static int stream_write(const void *buf, size_t len)
342359
343360 while (bytes_left ) {
344361 written = buffer_append (& bytes [len - bytes_left ], bytes_left );
345- if (written != bytes_left ) {
362+ written_total += written ;
363+
364+ if (flash_buf_written >= sizeof (flash_buf )) {
346365 ret = buffer_flush_to_flash ();
347366 if (ret ) {
348367 LOG_ERR ("buffer_flush_to_flash error %d" , ret );
368+ if (written_total ) {
369+ ret = trace_processed_callback (written );
370+ if (ret < 0 ) {
371+ LOG_ERR ("trace_processed_callback failed: %d" , ret );
372+ return ret ;
373+ }
374+ return written_total ;
375+ }
349376 return ret ;
350377 }
351378 }
352379 if (written > 0 ) {
353380 bytes_left -= written ;
354381 ret = trace_processed_callback (written );
355382 if (ret < 0 ) {
356- LOG_ERR ("trace_processed_callback failed: %d" , ret );
383+ LOG_ERR ("trace_processed_callback 2 failed: %d" , ret );
357384 return ret ;
358385 }
359386 }
360387 }
361388
362- return 0 ;
389+ return written_total ;
363390}
364391
365392int trace_backend_write (const void * data , size_t len )
366393{
367394 int write_ret = stream_write (data , len );
368395
369396 if (write_ret < 0 ) {
370- LOG_ERR ("write failed: %d" , write_ret );
371- return write_ret ;
397+ if (write_ret != - ENOSPC ) {
398+ LOG_ERR ("write failed: %d" , write_ret );
399+ }
372400 }
373401
374- return ( int ) len ;
402+ return write_ret ;
375403}
376404
377405int trace_backend_clear (void )
0 commit comments