summaryrefslogtreecommitdiffstats
path: root/cli.c
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@dside.dyndns.org>2011-12-14 00:29:21 +0100
committerSuren A. Chilingaryan <csa@dside.dyndns.org>2011-12-14 00:29:21 +0100
commitc4c9ad7708ddd3114f78c5f860ebfeb92cfb79c3 (patch)
tree19063034154415a9a0076b18d7b626dad50bc2ea /cli.c
parenta7cd579fbd12fdfc84ac5eff32dd5af093d78631 (diff)
downloadipecamera-c4c9ad7708ddd3114f78c5f860ebfeb92cfb79c3.tar.gz
ipecamera-c4c9ad7708ddd3114f78c5f860ebfeb92cfb79c3.tar.bz2
ipecamera-c4c9ad7708ddd3114f78c5f860ebfeb92cfb79c3.tar.xz
ipecamera-c4c9ad7708ddd3114f78c5f860ebfeb92cfb79c3.zip
Synchronize kernel buffers during the read-kernel-memory and while accessing via sysfs
Diffstat (limited to 'cli.c')
-rw-r--r--cli.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/cli.c b/cli.c
index b6c5c6a..2496d81 100644
--- a/cli.c
+++ b/cli.c
@@ -1836,13 +1836,21 @@ int ListKMEM(pcilib_t *handle, const char *device) {
}
int ReadKMEM(pcilib_t *handle, const char *device, pcilib_kmem_use_t use, size_t block, size_t max_size, FILE *o) {
+ int err;
void *data;
size_t size;
pcilib_kmem_handle_t *kbuf;
kbuf = pcilib_alloc_kernel_memory(handle, 0, block + 1, 0, 0, use, PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_TRY);
if (!kbuf) {
- printf("The specified kernel buffer is not allocated\n");
+ Error("The specified kernel buffer is not allocated\n");
+ return 0;
+ }
+
+ err = pcilib_kmem_sync_block(handle, kbuf, PCILIB_KMEM_SYNC_FROMDEVICE, block);
+ if (err) {
+ pcilib_free_kernel_memory(handle, kbuf, KMEM_FLAG_REUSE);
+ Error("The synchronization of kernel buffer has failed\n");
return 0;
}
@@ -1850,9 +1858,12 @@ int ReadKMEM(pcilib_t *handle, const char *device, pcilib_kmem_use_t use, size_t
if (data) {
size = pcilib_kmem_get_block_size(handle, kbuf, block);
if ((max_size)&&(size > max_size)) size = max_size;
+
fwrite(data, 1, size, o?o:stdout);
} else {
- printf("The specified block is not existing\n");
+ pcilib_free_kernel_memory(handle, kbuf, KMEM_FLAG_REUSE);
+ Error("The specified block is not existing\n");
+ return 0;
}
pcilib_free_kernel_memory(handle, kbuf, KMEM_FLAG_REUSE);
@@ -2069,10 +2080,6 @@ int ReadBuffer(pcilib_t *handle, const char *device, pcilib_model_description_t
pcilib_stop_dma(handle, dmaid, 0);
-
-
-// printf("%i %i\n", dma, buffer);
-// printf("%lx\n", ((dma&0x7F)|((dma_direction == PCILIB_DMA_TO_DEVICE)?0x80:0x00))|(PCILIB_KMEM_USE_DMA_PAGES<<16));
return ReadKMEM(handle, device, ((dma&0x7F)|((dma_direction == PCILIB_DMA_TO_DEVICE)?0x80:0x00))|(PCILIB_KMEM_USE_DMA_PAGES<<16), block, size, o);
}