Lines Matching refs:rbuf

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