int mite_sync_input_dma(struct mite_channel *mite_chan, comedi_async * async) { int count; unsigned int nbytes, old_alloc_count; const unsigned bytes_per_scan = cfc_bytes_per_scan(async->subdevice); old_alloc_count = async->buf_write_alloc_count; // write alloc as much as we can comedi_buf_write_alloc(async, async->prealloc_bufsz); nbytes = mite_bytes_written_to_memory_lb(mite_chan); if ((int)(mite_bytes_written_to_memory_ub(mite_chan) - old_alloc_count) > 0) { rt_printk("mite: DMA overwrite of free area\n"); async->events |= COMEDI_CB_OVERFLOW; return -1; } count = nbytes - async->buf_write_count; /* it's possible count will be negative due to * conservative value returned by mite_bytes_written_to_memory_lb */ if (count <= 0) { return 0; } comedi_buf_write_free(async, count); async->scan_progress += count; if (async->scan_progress >= bytes_per_scan) { async->scan_progress %= bytes_per_scan; async->events |= COMEDI_CB_EOS; } async->events |= COMEDI_CB_BLOCK; return 0; }
int mite_sync_input_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s) { struct comedi_async *async = s->async; int count; unsigned int nbytes, old_alloc_count; old_alloc_count = async->buf_write_alloc_count; /* write alloc as much as we can */ comedi_buf_write_alloc(s, async->prealloc_bufsz); nbytes = mite_bytes_written_to_memory_lb(mite_chan); if ((int)(mite_bytes_written_to_memory_ub(mite_chan) - old_alloc_count) > 0) { dev_warn(s->device->class_dev, "mite: DMA overwrite of free area\n"); async->events |= COMEDI_CB_OVERFLOW; return -1; } count = nbytes - async->buf_write_count; /* * it's possible count will be negative due to conservative value * returned by mite_bytes_written_to_memory_lb */ if (count <= 0) return 0; comedi_buf_write_free(s, count); comedi_inc_scan_progress(s, count); async->events |= COMEDI_CB_BLOCK; return 0; }
int comedi_buf_put(struct comedi_async *async, short x) { unsigned int n = __comedi_buf_write_alloc(async, sizeof(short), 1); if (n < sizeof(short)) { async->events |= COMEDI_CB_ERROR; return 0; } *(short *)(async->prealloc_buf + async->buf_write_ptr) = x; comedi_buf_write_free(async, sizeof(short)); return 1; }
int comedi_mark_buffer_written(void *d, unsigned int subdevice, unsigned int num_bytes) { struct comedi_device *dev = (struct comedi_device *) d; struct comedi_subdevice *s = dev->subdevices + subdevice; struct comedi_async *async; int bytes_written; if (subdevice >= dev->n_subdevices) return -1; async = s->async; if (async == NULL) return -1; bytes_written = comedi_buf_write_alloc(async, num_bytes); comedi_buf_write_free(async, bytes_written); if (bytes_written != num_bytes) return -1; return 0; }
/* Writes an array of data points to comedi's buffer */ unsigned int cfc_write_array_to_buffer(struct comedi_subdevice *subd, void *data, unsigned int num_bytes) { struct comedi_async *async = subd->async; unsigned int retval; if (num_bytes == 0) return 0; retval = comedi_buf_write_alloc(async, num_bytes); if (retval != num_bytes) { dev_warn(subd->device->class_dev, "comedi: buffer overrun\n"); async->events |= COMEDI_CB_OVERFLOW; return 0; } comedi_buf_memcpy_to(async, 0, data, num_bytes); comedi_buf_write_free(async, num_bytes); increment_scan_progress(subd, num_bytes); async->events |= COMEDI_CB_BLOCK; return num_bytes; }