Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 354026
b: refs/heads/master
c: 8d4be66
h: refs/heads/master
v: v3
  • Loading branch information
H Hartley Sweeten authored and Greg Kroah-Hartman committed Jan 18, 2013
1 parent 41a25ed commit 07ddbfe
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 34 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 47181eab71a81a919bf74eee570d6db59c6cf298
refs/heads/master: 8d4be669479d95a0c6eb4b6a538460f0ab35c4f7
74 changes: 41 additions & 33 deletions trunk/drivers/staging/comedi/comedi_buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,49 +194,57 @@ unsigned int comedi_buf_write_alloc(struct comedi_async *async,
}
EXPORT_SYMBOL(comedi_buf_write_alloc);

/* munging is applied to data by core as it passes between user
* and kernel space */
/*
* munging is applied to data by core as it passes between user
* and kernel space
*/
static unsigned int comedi_buf_munge(struct comedi_async *async,
unsigned int num_bytes)
{
struct comedi_subdevice *s = async->subdevice;
unsigned int count = 0;
const unsigned num_sample_bytes = bytes_per_sample(s);

if (s->munge == NULL || (async->cmd.flags & CMDF_RAWDATA)) {
if (!s->munge || (async->cmd.flags & CMDF_RAWDATA)) {
async->munge_count += num_bytes;
BUG_ON((int)(async->munge_count - async->buf_write_count) > 0);
return num_bytes;
}
/* don't munge partial samples */
num_bytes -= num_bytes % num_sample_bytes;
while (count < num_bytes) {
int block_size;

block_size = num_bytes - count;
if (block_size < 0) {
dev_warn(s->device->class_dev,
"%s: %s: bug! block_size is negative\n",
__FILE__, __func__);
break;
count = num_bytes;
} else {
/* don't munge partial samples */
num_bytes -= num_bytes % num_sample_bytes;
while (count < num_bytes) {
int block_size = num_bytes - count;
unsigned int buf_end;

if (block_size < 0) {
dev_warn(s->device->class_dev,
"%s: %s: bug! block_size is negative\n",
__FILE__, __func__);
break;
}

buf_end = async->prealloc_bufsz - async->munge_ptr;
if (block_size > buf_end)
block_size = buf_end;

s->munge(s->device, s,
async->prealloc_buf + async->munge_ptr,
block_size, async->munge_chan);

/*
* ensure data is munged in buffer before the
* async buffer munge_count is incremented
*/
smp_wmb();

async->munge_chan += block_size / num_sample_bytes;
async->munge_chan %= async->cmd.chanlist_len;
async->munge_count += block_size;
async->munge_ptr += block_size;
async->munge_ptr %= async->prealloc_bufsz;
count += block_size;
}
if ((int)(async->munge_ptr + block_size -
async->prealloc_bufsz) > 0)
block_size = async->prealloc_bufsz - async->munge_ptr;

s->munge(s->device, s, async->prealloc_buf + async->munge_ptr,
block_size, async->munge_chan);

smp_wmb(); /* barrier insures data is munged in buffer
* before munge_count is incremented */

async->munge_chan += block_size / num_sample_bytes;
async->munge_chan %= async->cmd.chanlist_len;
async->munge_count += block_size;
async->munge_ptr += block_size;
async->munge_ptr %= async->prealloc_bufsz;
count += block_size;
}

BUG_ON((int)(async->munge_count - async->buf_write_count) > 0);
return count;
}
Expand Down

0 comments on commit 07ddbfe

Please sign in to comment.