blob: 71fe4edef46c6ecb45e03d37d885a8e9a673a62e [file] [log] [blame]
Christina Quast4db82e02015-04-11 18:14:41 +02001#include "ringbuffer.h"
2#include "trace.h"
Harald Welte7abdb512016-03-03 17:48:32 +01003#include "utils.h"
Christina Quast542f9182015-04-11 09:31:15 +02004
Harald Welte7dd3dfd2016-03-03 12:32:04 +01005void rbuf_reset(volatile ringbuf * rb)
Christina Quast542f9182015-04-11 09:31:15 +02006{
Harald Welte7abdb512016-03-03 17:48:32 +01007 unsigned long state;
8
9 local_irq_save(state);
Harald Welte7dd3dfd2016-03-03 12:32:04 +010010 rb->ird = 0;
11 rb->iwr = 0;
Harald Welte7abdb512016-03-03 17:48:32 +010012 local_irq_restore(state);
Christina Quast542f9182015-04-11 09:31:15 +020013}
14
Harald Welte7dd3dfd2016-03-03 12:32:04 +010015uint8_t rbuf_read(volatile ringbuf * rb)
Christina Quast542f9182015-04-11 09:31:15 +020016{
Harald Welte7abdb512016-03-03 17:48:32 +010017 unsigned long state;
18 uint8_t val;
19
20 local_irq_save(state);
21 val = rb->buf[rb->ird];
Harald Welte7dd3dfd2016-03-03 12:32:04 +010022 rb->ird = (rb->ird + 1) % RING_BUFLEN;
Harald Welte7abdb512016-03-03 17:48:32 +010023 local_irq_restore(state);
24
Harald Welte7dd3dfd2016-03-03 12:32:04 +010025 return val;
Christina Quast542f9182015-04-11 09:31:15 +020026}
27
Harald Welte7dd3dfd2016-03-03 12:32:04 +010028uint8_t rbuf_peek(volatile ringbuf * rb)
Christina Quast7a7f98c2015-05-02 14:10:13 +020029{
Harald Welte7dd3dfd2016-03-03 12:32:04 +010030 return rb->buf[rb->ird];
Christina Quast7a7f98c2015-05-02 14:10:13 +020031}
32
Harald Welte7dd3dfd2016-03-03 12:32:04 +010033bool rbuf_is_empty(volatile ringbuf * rb)
Christina Quast4db82e02015-04-11 18:14:41 +020034{
Harald Welte7dd3dfd2016-03-03 12:32:04 +010035 return rb->ird == rb->iwr;
Christina Quast4db82e02015-04-11 18:14:41 +020036}
37
Harald Welte7abdb512016-03-03 17:48:32 +010038static bool __rbuf_is_full(volatile ringbuf * rb)
Christina Quast4db82e02015-04-11 18:14:41 +020039{
Harald Welte7dd3dfd2016-03-03 12:32:04 +010040 return rb->ird == (rb->iwr + 1) % RING_BUFLEN;
Christina Quast4db82e02015-04-11 18:14:41 +020041}
Harald Welte7abdb512016-03-03 17:48:32 +010042
43bool rbuf_is_full(volatile ringbuf * rb)
44{
45 unsigned long state;
46 bool rc;
47
48 local_irq_save(state);
49 rc = rb->ird == (rb->iwr + 1) % RING_BUFLEN;
50 local_irq_restore(state);
51
52 return rc;
53}
54
55void rbuf_write(volatile volatile ringbuf * rb, uint8_t item)
56{
57 unsigned long state;
58
59 local_irq_save(state);
60 if (!__rbuf_is_full(rb)) {
61 rb->buf[rb->iwr] = item;
62 rb->iwr = (rb->iwr + 1) % RING_BUFLEN;
63 local_irq_restore(state);
64 } else {
65 local_irq_restore(state);
66 TRACE_ERROR("Ringbuffer full, losing bytes!");
67 }
68}
69
70