struct vdpram_dev *dev = filp->private_data;
int index = dev->adj_index ;
char *curr_rp, *curr_adj_wp;
+ int restData_len = 0, data_len = 0;
#if 0
int i = 0; /* for debug */
#endif
if (dev->adj->wp > dev->rp)
{
count = min(count, (size_t)(dev->adj->wp - dev->rp));
+ data_len = count;
if (copy_to_user(buf, dev->rp, count)) {
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
dev->rp += count;
if (dev->rp >= buffer[index].end)
+ {
dev->rp = buffer[index].begin; /* wrapped */
+ }
}
else /* the write pointer has wrapped, return data up to dev->end */
{
- int tmp_count ;
-
- tmp_count = min(count, (size_t)(buffer[index].end - dev->rp + 1));
- if (copy_to_user(buf, dev->rp,tmp_count)) {
+ data_len = min(count, (size_t)(buffer[index].end - dev->rp));
+ if (copy_to_user(buf, dev->rp, data_len)) {
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
#endif //VDPRAM_LOCK_ENABLE
return -EFAULT;
}
- dev->rp += tmp_count;
+ dev->rp += data_len;
+ if(dev->rp >= buffer[index].end)
+ dev->rp = buffer[index].begin;
- if ( count - tmp_count > 0)
+ if ( count - data_len > 0)
{
- tmp_count = min ( count - tmp_count, sizeof(dev->adj->wp - buffer[index].begin));
- if (copy_to_user(buf,dev->rp,tmp_count)) {
+ restData_len = min ( count - data_len, (size_t)(dev->adj->wp - buffer[index].begin));
+ if (copy_to_user(buf + data_len, dev->rp, restData_len)) {
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
#endif //VDPRAM_LOCK_ENABLE
return -EFAULT;
}
- dev->rp += tmp_count;
-
- if (dev->rp != dev->adj->wp)
- dev->rp = buffer[index].begin; /* wrapped */
+ dev->rp += restData_len;
}
}
dev->rp += count;
if(dev->rp >= buffer[index].end)
+ {
dev->rp = buffer[index].begin; /* wrapped */
+ }
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
#endif //VDPRAM_LOCK_ENABLE
// printk("%s:%d rp[%d]=%d cnt=%d \n", __FUNCTION__,current->pid,dev->index, dev->rp-buffer[index].begin,count);
/* finally, awake any writers and return */
wake_up_interruptible(&queue[index].outq);
- return count;
+ return data_len + restData_len;
}
/* Wait for space for writing; caller must hold device semaphore. On
static int spacefree(struct vdpram_dev *dev)
{
int index = dev->index;
+
if (dev->wp == dev->adj->rp)
return buffer[index].buffersize - 1;
return ((dev->adj->rp + buffer[index].buffersize - dev->wp) % buffer[index].buffersize) - 1;
{
if (dev->wp >= dev->adj->rp)
{
- int tmp_count ;
- tmp_count = min(count, (size_t)(buffer[index].end - dev->wp)); /* to end-of-buf */
+ int data_len;
+ data_len = min(count, (size_t)(buffer[index].end - dev->wp)); /* to end-of-buf */
- if (tmp_count != 0 && copy_from_user(dev->wp, buf, tmp_count))
+ if (data_len != 0 && copy_from_user(dev->wp, buf, data_len))
{
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
return -EFAULT;
}
- dev->wp += tmp_count;
- if (dev->wp > buffer[index].end )
+ dev->wp += data_len;
+ if (dev->wp >= buffer[index].end)
{
// printk("%s: back 0 !! \n",__FUNCTION__);
dev->wp = buffer[index].begin; /* wrapped */
}
- if (count-tmp_count > 0 )
- {
- tmp_count = min ( count - tmp_count, sizeof(dev->adj->rp - buffer[index].begin));
- if(copy_from_user(dev->wp, buf + tmp_count, tmp_count))
+ if (count - data_len > 0 )
+ {
+ int restData_len = 0;
+ restData_len = min ( count - data_len, (size_t)(dev->adj->rp - buffer[index].begin) - 1 );
+ if(copy_from_user(dev->wp, buf + data_len, restData_len))
{
#ifdef VDPRAM_LOCK_ENABLE
up (&buffer[index].sem);
#endif //VDPRAM_LOCK_ENABLE
return -EFAULT;
}
+ dev->wp += restData_len;
}
}
else /* the write pointer has wrapped, fill up to rp-1 */
}
/* for debug */
#if 0
+ int i;
printk("write[%d]: ", index);
for(i=0; i<count; ++i) {
printk("%x ", *(dev->wp+i));
}
dev->wp += count;
if (dev->wp == buffer[index].end)
+ {
dev->wp = buffer[index].begin; /* wrapped */
+ }
#endif // NOT_CIRCLE_QUEUE
struct vdpram_dev *dev;
struct vdpram_status_dev dev_status;
int index;
-
dev = (struct vdpram_dev*)filp->private_data;
index = dev->index ;
// dev_t dev;
dev_t dev = MKDEV(vdpram_major, 0);
-// printk("Initializing vdpram device driver ...\n");
+ printk("Initializing vdpram device driver ...\n");
result = register_chrdev_region(dev, vdpram_nr_devs, "vdpram");
// result = alloc_chrdev_region(&dev, 0, vdpram_nr_devs, "vdpram");
if (result < 0) {