Christina Quast | 4db82e0 | 2015-04-11 18:14:41 +0200 | [diff] [blame] | 1 | #include "ringbuffer.h" |
2 | #include "trace.h" | ||||
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 3 | #include "utils.h" |
Christina Quast | 542f918 | 2015-04-11 09:31:15 +0200 | [diff] [blame] | 4 | |
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 5 | void rbuf_reset(volatile ringbuf * rb) |
Christina Quast | 542f918 | 2015-04-11 09:31:15 +0200 | [diff] [blame] | 6 | { |
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 7 | unsigned long state; |
8 | |||||
9 | local_irq_save(state); | ||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 10 | rb->ird = 0; |
11 | rb->iwr = 0; | ||||
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 12 | local_irq_restore(state); |
Christina Quast | 542f918 | 2015-04-11 09:31:15 +0200 | [diff] [blame] | 13 | } |
14 | |||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 15 | uint8_t rbuf_read(volatile ringbuf * rb) |
Christina Quast | 542f918 | 2015-04-11 09:31:15 +0200 | [diff] [blame] | 16 | { |
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 17 | unsigned long state; |
18 | uint8_t val; | ||||
19 | |||||
20 | local_irq_save(state); | ||||
21 | val = rb->buf[rb->ird]; | ||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 22 | rb->ird = (rb->ird + 1) % RING_BUFLEN; |
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 23 | local_irq_restore(state); |
24 | |||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 25 | return val; |
Christina Quast | 542f918 | 2015-04-11 09:31:15 +0200 | [diff] [blame] | 26 | } |
27 | |||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 28 | uint8_t rbuf_peek(volatile ringbuf * rb) |
Christina Quast | 7a7f98c | 2015-05-02 14:10:13 +0200 | [diff] [blame] | 29 | { |
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 30 | return rb->buf[rb->ird]; |
Christina Quast | 7a7f98c | 2015-05-02 14:10:13 +0200 | [diff] [blame] | 31 | } |
32 | |||||
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 33 | bool rbuf_is_empty(volatile ringbuf * rb) |
Christina Quast | 4db82e0 | 2015-04-11 18:14:41 +0200 | [diff] [blame] | 34 | { |
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 35 | return rb->ird == rb->iwr; |
Christina Quast | 4db82e0 | 2015-04-11 18:14:41 +0200 | [diff] [blame] | 36 | } |
37 | |||||
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 38 | static bool __rbuf_is_full(volatile ringbuf * rb) |
Christina Quast | 4db82e0 | 2015-04-11 18:14:41 +0200 | [diff] [blame] | 39 | { |
Harald Welte | 7dd3dfd | 2016-03-03 12:32:04 +0100 | [diff] [blame] | 40 | return rb->ird == (rb->iwr + 1) % RING_BUFLEN; |
Christina Quast | 4db82e0 | 2015-04-11 18:14:41 +0200 | [diff] [blame] | 41 | } |
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 42 | |
43 | bool 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 | |||||
Kévin Redon | a93f727 | 2018-05-21 17:17:20 +0200 | [diff] [blame] | 55 | void rbuf_write(volatile ringbuf * rb, uint8_t item) |
Harald Welte | 7abdb51 | 2016-03-03 17:48:32 +0100 | [diff] [blame] | 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 |