Lines Matching defs:rbuf

38 void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
40 rbuf->pread=rbuf->pwrite=0;
41 rbuf->data=data;
42 rbuf->size=len;
43 rbuf->error=0;
45 init_waitqueue_head(&rbuf->queue);
47 spin_lock_init(&(rbuf->lock));
52 int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)
60 return (rbuf->pread == smp_load_acquire(&rbuf->pwrite));
65 ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)
74 free = READ_ONCE(rbuf->pread) - rbuf->pwrite;
76 free += rbuf->size;
82 ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
90 avail = smp_load_acquire(&rbuf->pwrite) - rbuf->pread;
92 avail += rbuf->size;
98 void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
106 smp_store_release(&rbuf->pread, smp_load_acquire(&rbuf->pwrite));
107 rbuf->error = 0;
111 void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)
116 smp_store_release(&rbuf->pread, 0);
118 smp_store_release(&rbuf->pwrite, 0);
119 rbuf->error = 0;
122 void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
126 spin_lock_irqsave(&rbuf->lock, flags);
127 dvb_ringbuffer_flush(rbuf);
128 spin_unlock_irqrestore(&rbuf->lock, flags);
130 wake_up(&rbuf->queue);
133 ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, size_t len)
138 split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
140 if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
148 smp_store_release(&rbuf->pread, 0);
150 if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
154 smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size);
159 void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len)
164 split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
166 memcpy(buf, rbuf->data+rbuf->pread, split);
173 smp_store_release(&rbuf->pread, 0);
175 memcpy(buf, rbuf->data+rbuf->pread, todo);
178 smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size);
182 ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t len)
187 split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
190 memcpy(rbuf->data+rbuf->pwrite, buf, split);
198 smp_store_release(&rbuf->pwrite, 0);
200 memcpy(rbuf->data+rbuf->pwrite, buf, todo);
202 smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size);
207 ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf,
214 split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
217 status = copy_from_user(rbuf->data+rbuf->pwrite, buf, split);
227 smp_store_release(&rbuf->pwrite, 0);
229 status = copy_from_user(rbuf->data+rbuf->pwrite, buf, todo);
233 smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size);
238 ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf, size_t len)
241 ssize_t oldpwrite = rbuf->pwrite;
243 DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
244 DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
245 DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY);
246 status = dvb_ringbuffer_write(rbuf, buf, len);
248 if (status < 0) rbuf->pwrite = oldpwrite;
252 ssize_t dvb_ringbuffer_pkt_read_user(struct dvb_ringbuffer *rbuf, size_t idx,
259 pktlen = rbuf->data[idx] << 8;
260 pktlen |= rbuf->data[(idx + 1) % rbuf->size];
264 idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
266 split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
268 if (copy_to_user(buf, rbuf->data+idx, split))
274 if (copy_to_user(buf, rbuf->data+idx, todo))
280 ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
287 pktlen = rbuf->data[idx] << 8;
288 pktlen |= rbuf->data[(idx + 1) % rbuf->size];
292 idx = (idx + DVB_RINGBUFFER_PKTHDRSIZE + offset) % rbuf->size;
294 split = ((idx + len) > rbuf->size) ? rbuf->size - idx : 0;
296 memcpy(buf, rbuf->data+idx, split);
301 memcpy(buf, rbuf->data+idx, todo);
305 void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)
309 rbuf->data[(idx + 2) % rbuf->size] = PKT_DISPOSED;
312 while(dvb_ringbuffer_avail(rbuf) > DVB_RINGBUFFER_PKTHDRSIZE) {
313 if (DVB_RINGBUFFER_PEEK(rbuf, 2) == PKT_DISPOSED) {
314 pktlen = DVB_RINGBUFFER_PEEK(rbuf, 0) << 8;
315 pktlen |= DVB_RINGBUFFER_PEEK(rbuf, 1);
316 DVB_RINGBUFFER_SKIP(rbuf, pktlen + DVB_RINGBUFFER_PKTHDRSIZE);
324 ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t* pktlen)
331 idx = rbuf->pread;
333 curpktlen = rbuf->data[idx] << 8;
334 curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
335 idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
338 consumed = (idx - rbuf->pread);
340 consumed += rbuf->size;
342 while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {
344 curpktlen = rbuf->data[idx] << 8;
345 curpktlen |= rbuf->data[(idx + 1) % rbuf->size];
346 curpktstatus = rbuf->data[(idx + 2) % rbuf->size];
354 idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;