static rt_size_t _write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) { rt_err_t err; struct rt_vbus_dev *vdev = dev->user_data; RT_ASSERT(vdev->chnr != 0); if (rt_interrupt_get_nest() == 0) { /* Thread context. */ err = rt_vbus_post(vdev->chnr, vdev->req.prio, buffer, size, RT_WAITING_FOREVER); } else { /* Interrupt context. */ err = rt_vbus_post(vdev->chnr, vdev->req.prio, buffer, size, 0); } if (err) { rt_set_errno(err); return 0; } return size; }
static ssize_t vbus_chnx_write(struct file *filp, const char __user *buf, size_t size, loff_t *offp) { int res; unsigned long chnr = (unsigned long)(filp->private_data); char *kbuf = kmalloc(size, GFP_KERNEL); if (!kbuf) return -ENOMEM; res = copy_from_user(kbuf, buf, size); if (res < 0) return -EFAULT; res = rt_vbus_post(chnr, _ctxs[chnr].prio, kbuf, size); kfree(kbuf); /* We simplified the things by treating the signal as error. */ if (unlikely(res)) { /* Make sure the error is returned as negative values. */ if (res < 0) return res; else return -res; } else return size; }