Loading drivers/media/dvb-core/dvb_ringbuffer.c +17 −19 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * Copyright (C) 2003 Oliver Endriss * Copyright (C) 2004 Andrew de Quincey * * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * based on code originally found in av7110.c & dvb_ci.c: * Copyright (C) 1999-2003 Ralph Metzler Loading Loading @@ -49,7 +49,6 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) rbuf->data=data; rbuf->size=len; rbuf->error=0; atomic_set(&rbuf->fill, 0); init_waitqueue_head(&rbuf->queue); Loading @@ -58,23 +57,33 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf) int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf) { return (atomic_read(&rbuf->fill) == 0); return (rbuf->pread == rbuf->pwrite); } ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf) ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf) { return rbuf->size - atomic_read(&rbuf->fill); ssize_t free; free = rbuf->pread - rbuf->pwrite; if (free <= 0) free += rbuf->size; return free-1; } ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf) ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) { return atomic_read(&rbuf->fill); ssize_t avail; avail = rbuf->pwrite - rbuf->pread; if (avail < 0) avail += rbuf->size; return avail; } Loading @@ -83,7 +92,6 @@ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf) { rbuf->pread = rbuf->pwrite; rbuf->error = 0; atomic_set(&rbuf->fill, 0); } EXPORT_SYMBOL(dvb_ringbuffer_flush); Loading @@ -91,9 +99,7 @@ void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf) { rbuf->pread = rbuf->pwrite = 0; rbuf->error = 0; atomic_set(&rbuf->fill, 0); } EXPORT_SYMBOL(dvb_ringbuffer_reset); void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf) { Loading @@ -118,13 +124,11 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, si buf += split; todo -= split; rbuf->pread = 0; atomic_sub(split, &rbuf->fill); } if (copy_to_user(buf, rbuf->data+rbuf->pread, todo)) return -EFAULT; rbuf->pread = (rbuf->pread + todo) % rbuf->size; atomic_sub(todo, &rbuf->fill); return len; } Loading @@ -140,12 +144,10 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len) buf += split; todo -= split; rbuf->pread = 0; atomic_sub(split, &rbuf->fill); } memcpy(buf, rbuf->data+rbuf->pread, todo); rbuf->pread = (rbuf->pread + todo) % rbuf->size; atomic_sub(todo, &rbuf->fill); } Loading @@ -161,11 +163,9 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t buf += split; todo -= split; rbuf->pwrite = 0; atomic_add(split, &rbuf->fill); } memcpy(rbuf->data+rbuf->pwrite, buf, todo); rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; atomic_add(todo, &rbuf->fill); return len; } Loading @@ -187,7 +187,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, buf += split; todo -= split; rbuf->pwrite = 0; atomic_add(split, &rbuf->fill); } if (copy_from_user(rbuf->data + rbuf->pwrite, buf, todo)) { Loading @@ -196,7 +195,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, } rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; atomic_add(todo, &rbuf->fill); return len; } Loading drivers/media/dvb-core/dvb_ringbuffer.h +12 −16 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * Copyright (C) 2003 Oliver Endriss * Copyright (C) 2004 Andrew de Quincey * * Copyright (c) 2012,2014, The Linux Foundation. All rights reserved. * Copyright (c) 2012, The Linux Foundation. All rights reserved. * * based on code originally found in av7110.c & dvb_ci.c: * Copyright (C) 1999-2003 Ralph Metzler & Marcus Metzler Loading Loading @@ -37,7 +37,6 @@ struct dvb_ringbuffer { ssize_t size; ssize_t pread; ssize_t pwrite; atomic_t fill; int error; wait_queue_head_t queue; Loading Loading @@ -80,13 +79,13 @@ struct dvb_ringbuffer { extern void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len); /* test whether buffer is empty */ extern int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf); extern int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf); /* return the number of free bytes in the buffer */ extern ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf); extern ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf); /* return the number of bytes waiting in the buffer */ extern ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf); extern ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf); /* Loading @@ -110,13 +109,11 @@ extern void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf); /* advance read ptr by <num> bytes */ #define DVB_RINGBUFFER_SKIP(rbuf,num) \ { (rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size; \ atomic_sub((num), &(rbuf)->fill); } (rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size /* advance write ptr by <num> bytes */ #define DVB_RINGBUFFER_PUSH(rbuf, num) \ { ((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size)); \ atomic_add((num), &(rbuf)->fill); } ((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size)) /* ** read <len> bytes from ring buffer into <buf> Loading @@ -134,8 +131,7 @@ extern void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, /* write single byte to ring buffer */ #define DVB_RINGBUFFER_WRITE_BYTE(rbuf,byte) \ { (rbuf)->data[(rbuf)->pwrite]=(byte); \ (rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; \ atomic_inc(&(rbuf)->fill); } (rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; } /* ** write <len> bytes to ring buffer ** <usermem> specifies whether <buf> resides in user space Loading include/uapi/linux/dvb/dmx.h +4 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,10 @@ struct dmx_buffer_status { /* fullness of buffer in bytes */ unsigned int fullness; /* How many bytes are free */ /* * How many bytes are free * It's the same as: size-fullness-1 */ unsigned int free_bytes; /* read pointer offset in bytes */ Loading Loading
drivers/media/dvb-core/dvb_ringbuffer.c +17 −19 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * Copyright (C) 2003 Oliver Endriss * Copyright (C) 2004 Andrew de Quincey * * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * based on code originally found in av7110.c & dvb_ci.c: * Copyright (C) 1999-2003 Ralph Metzler Loading Loading @@ -49,7 +49,6 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) rbuf->data=data; rbuf->size=len; rbuf->error=0; atomic_set(&rbuf->fill, 0); init_waitqueue_head(&rbuf->queue); Loading @@ -58,23 +57,33 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len) int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf) int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf) { return (atomic_read(&rbuf->fill) == 0); return (rbuf->pread == rbuf->pwrite); } ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf) ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf) { return rbuf->size - atomic_read(&rbuf->fill); ssize_t free; free = rbuf->pread - rbuf->pwrite; if (free <= 0) free += rbuf->size; return free-1; } ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf) ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf) { return atomic_read(&rbuf->fill); ssize_t avail; avail = rbuf->pwrite - rbuf->pread; if (avail < 0) avail += rbuf->size; return avail; } Loading @@ -83,7 +92,6 @@ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf) { rbuf->pread = rbuf->pwrite; rbuf->error = 0; atomic_set(&rbuf->fill, 0); } EXPORT_SYMBOL(dvb_ringbuffer_flush); Loading @@ -91,9 +99,7 @@ void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf) { rbuf->pread = rbuf->pwrite = 0; rbuf->error = 0; atomic_set(&rbuf->fill, 0); } EXPORT_SYMBOL(dvb_ringbuffer_reset); void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf) { Loading @@ -118,13 +124,11 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, si buf += split; todo -= split; rbuf->pread = 0; atomic_sub(split, &rbuf->fill); } if (copy_to_user(buf, rbuf->data+rbuf->pread, todo)) return -EFAULT; rbuf->pread = (rbuf->pread + todo) % rbuf->size; atomic_sub(todo, &rbuf->fill); return len; } Loading @@ -140,12 +144,10 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len) buf += split; todo -= split; rbuf->pread = 0; atomic_sub(split, &rbuf->fill); } memcpy(buf, rbuf->data+rbuf->pread, todo); rbuf->pread = (rbuf->pread + todo) % rbuf->size; atomic_sub(todo, &rbuf->fill); } Loading @@ -161,11 +163,9 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t buf += split; todo -= split; rbuf->pwrite = 0; atomic_add(split, &rbuf->fill); } memcpy(rbuf->data+rbuf->pwrite, buf, todo); rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; atomic_add(todo, &rbuf->fill); return len; } Loading @@ -187,7 +187,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, buf += split; todo -= split; rbuf->pwrite = 0; atomic_add(split, &rbuf->fill); } if (copy_from_user(rbuf->data + rbuf->pwrite, buf, todo)) { Loading @@ -196,7 +195,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf, } rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size; atomic_add(todo, &rbuf->fill); return len; } Loading
drivers/media/dvb-core/dvb_ringbuffer.h +12 −16 Original line number Diff line number Diff line Loading @@ -5,7 +5,7 @@ * Copyright (C) 2003 Oliver Endriss * Copyright (C) 2004 Andrew de Quincey * * Copyright (c) 2012,2014, The Linux Foundation. All rights reserved. * Copyright (c) 2012, The Linux Foundation. All rights reserved. * * based on code originally found in av7110.c & dvb_ci.c: * Copyright (C) 1999-2003 Ralph Metzler & Marcus Metzler Loading Loading @@ -37,7 +37,6 @@ struct dvb_ringbuffer { ssize_t size; ssize_t pread; ssize_t pwrite; atomic_t fill; int error; wait_queue_head_t queue; Loading Loading @@ -80,13 +79,13 @@ struct dvb_ringbuffer { extern void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len); /* test whether buffer is empty */ extern int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf); extern int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf); /* return the number of free bytes in the buffer */ extern ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf); extern ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf); /* return the number of bytes waiting in the buffer */ extern ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf); extern ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf); /* Loading @@ -110,13 +109,11 @@ extern void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf); /* advance read ptr by <num> bytes */ #define DVB_RINGBUFFER_SKIP(rbuf,num) \ { (rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size; \ atomic_sub((num), &(rbuf)->fill); } (rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size /* advance write ptr by <num> bytes */ #define DVB_RINGBUFFER_PUSH(rbuf, num) \ { ((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size)); \ atomic_add((num), &(rbuf)->fill); } ((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size)) /* ** read <len> bytes from ring buffer into <buf> Loading @@ -134,8 +131,7 @@ extern void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, /* write single byte to ring buffer */ #define DVB_RINGBUFFER_WRITE_BYTE(rbuf,byte) \ { (rbuf)->data[(rbuf)->pwrite]=(byte); \ (rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; \ atomic_inc(&(rbuf)->fill); } (rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; } /* ** write <len> bytes to ring buffer ** <usermem> specifies whether <buf> resides in user space Loading
include/uapi/linux/dvb/dmx.h +4 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,10 @@ struct dmx_buffer_status { /* fullness of buffer in bytes */ unsigned int fullness; /* How many bytes are free */ /* * How many bytes are free * It's the same as: size-fullness-1 */ unsigned int free_bytes; /* read pointer offset in bytes */ Loading