int mite_sync_output_dma(struct mite_channel *mite_chan, comedi_async * async) { int count; u32 nbytes_ub, nbytes_lb; unsigned int old_alloc_count; u32 stop_count = async->cmd.stop_arg * cfc_bytes_per_scan(async->subdevice); old_alloc_count = async->buf_read_alloc_count; // read alloc as much as we can comedi_buf_read_alloc(async, async->prealloc_bufsz); nbytes_lb = mite_bytes_read_from_memory_lb(mite_chan); if (async->cmd.stop_src == TRIG_COUNT && (int)(nbytes_lb - stop_count) > 0) nbytes_lb = stop_count; nbytes_ub = mite_bytes_read_from_memory_ub(mite_chan); if (async->cmd.stop_src == TRIG_COUNT && (int)(nbytes_ub - stop_count) > 0) nbytes_ub = stop_count; if ((int)(nbytes_ub - old_alloc_count) > 0) { rt_printk("mite: DMA underrun\n"); async->events |= COMEDI_CB_OVERFLOW; return -1; } count = nbytes_lb - async->buf_read_count; if (count <= 0) { return 0; } if (count) { comedi_buf_read_free(async, count); async->events |= COMEDI_CB_BLOCK; } return 0; }
int mite_sync_output_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s) { struct comedi_async *async = s->async; struct comedi_cmd *cmd = &async->cmd; u32 stop_count = cmd->stop_arg * comedi_bytes_per_scan(s); unsigned int old_alloc_count = async->buf_read_alloc_count; u32 nbytes_ub, nbytes_lb; int count; /* read alloc as much as we can */ comedi_buf_read_alloc(s, async->prealloc_bufsz); nbytes_lb = mite_bytes_read_from_memory_lb(mite_chan); if (cmd->stop_src == TRIG_COUNT && (int)(nbytes_lb - stop_count) > 0) nbytes_lb = stop_count; nbytes_ub = mite_bytes_read_from_memory_ub(mite_chan); if (cmd->stop_src == TRIG_COUNT && (int)(nbytes_ub - stop_count) > 0) nbytes_ub = stop_count; if ((int)(nbytes_ub - old_alloc_count) > 0) { dev_warn(s->device->class_dev, "mite: DMA underrun\n"); async->events |= COMEDI_CB_OVERFLOW; return -1; } count = nbytes_lb - async->buf_read_count; if (count <= 0) return 0; if (count) { comedi_buf_read_free(s, count); async->events |= COMEDI_CB_BLOCK; } return 0; }
int comedi_buf_get(struct comedi_async *async, short *x) { unsigned int n = comedi_buf_read_n_available(async); if (n < sizeof(short)) return 0; comedi_buf_read_alloc(async, sizeof(short)); *x = *(short *)(async->prealloc_buf + async->buf_read_ptr); comedi_buf_read_free(async, sizeof(short)); return 1; }
unsigned int cfc_read_array_from_buffer(struct comedi_subdevice *subd, void *data, unsigned int num_bytes) { struct comedi_async *async = subd->async; if (num_bytes == 0) return 0; num_bytes = comedi_buf_read_alloc(async, num_bytes); comedi_buf_memcpy_from(async, 0, data, num_bytes); comedi_buf_read_free(async, num_bytes); increment_scan_progress(subd, num_bytes); async->events |= COMEDI_CB_BLOCK; return num_bytes; }
int comedi_mark_buffer_read(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; if (subdevice >= dev->n_subdevices) return -1; async = s->async; if (async == NULL) return -1; comedi_buf_read_alloc(async, num_bytes); comedi_buf_read_free(async, num_bytes); return 0; }
/* * ALPHA */ int comedi_set_user_int_count(void *d, unsigned int subdevice, unsigned int buf_user_count) { struct comedi_device *dev = (struct comedi_device *) d; struct comedi_subdevice *s = dev->subdevices + subdevice; struct comedi_async *async; int num_bytes; async = s->async; if (async == NULL) return -1; num_bytes = buf_user_count - async->buf_read_count; if (num_bytes < 0) return -1; comedi_buf_read_alloc(async, num_bytes); comedi_buf_read_free(async, num_bytes); return 0; }