master/cdev.c
branchstable-1.5
changeset 2522 ec403cf308eb
parent 2516 3680924f6f87
child 2681 9953c0d372ab
equal deleted inserted replaced
2521:3d68bb0047a1 2522:ec403cf308eb
   220 
   220 
   221 /** Memory-map callback for the EtherCAT character device.
   221 /** Memory-map callback for the EtherCAT character device.
   222  *
   222  *
   223  * The actual mapping will be done in the eccdev_vma_nopage() callback of the
   223  * The actual mapping will be done in the eccdev_vma_nopage() callback of the
   224  * virtual memory area.
   224  * virtual memory area.
       
   225  *
       
   226  * \return Always zero (success).
   225  */
   227  */
   226 int eccdev_mmap(
   228 int eccdev_mmap(
   227         struct file *filp,
   229         struct file *filp,
   228         struct vm_area_struct *vma
   230         struct vm_area_struct *vma
   229         )
   231         )
   245 
   247 
   246 /** Page fault callback for a virtual memory area.
   248 /** Page fault callback for a virtual memory area.
   247  *
   249  *
   248  * Called at the first access on a virtual-memory area retrieved with
   250  * Called at the first access on a virtual-memory area retrieved with
   249  * ecdev_mmap().
   251  * ecdev_mmap().
       
   252  *
       
   253  * \return Zero on success, otherwise a negative error code.
   250  */
   254  */
   251 static int eccdev_vma_fault(
   255 static int eccdev_vma_fault(
   252         struct vm_area_struct *vma, /**< Virtual memory area. */
   256         struct vm_area_struct *vma, /**< Virtual memory area. */
   253         struct vm_fault *vmf /**< Fault data. */
   257         struct vm_fault *vmf /**< Fault data. */
   254         )
   258         )
   255 {
   259 {
   256     unsigned long offset = vmf->pgoff << PAGE_SHIFT;
   260     unsigned long offset = vmf->pgoff << PAGE_SHIFT;
   257     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data;
   261     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data;
   258     struct page *page;
   262     struct page *page;
   259 
   263 
   260     if (offset >= priv->ctx.process_data_size)
   264     if (offset >= priv->ctx.process_data_size) {
   261         return VM_FAULT_SIGBUS;
   265         return VM_FAULT_SIGBUS;
       
   266     }
   262 
   267 
   263     page = vmalloc_to_page(priv->ctx.process_data + offset);
   268     page = vmalloc_to_page(priv->ctx.process_data + offset);
   264     if (!page)
   269     if (!page) {
   265         return VM_FAULT_SIGBUS;
   270         return VM_FAULT_SIGBUS;
       
   271     }
   266 
   272 
   267     get_page(page);
   273     get_page(page);
   268     vmf->page = page;
   274     vmf->page = page;
   269 
   275 
   270     EC_MASTER_DBG(priv->cdev->master, 1, "Vma fault, virtual_address = %p,"
   276     EC_MASTER_DBG(priv->cdev->master, 1, "Vma fault, virtual_address = %p,"