Example #1
0
/**
*
* \brief int close(int fd);
* close a file descriptor
* \param fd The descriptor to close.
*
* \b close closes a file descriptor, so that it no longer
*  refers to any device and may be reused.
* \returns
* close returns zero on success, or -1 if an error occurred.
* \par ERRORS
*
* the following errors can occur
*
* \arg \c BADF \b fd isn't a valid open file descriptor 
*

*/
__LDDK_CLOSE_TYPE can_close ( __LDDK_CLOSE_PARAM )
{
    DBGin("can_close");
    {
	unsigned int minor = __LDDK_MINOR;

	CAN_StopChip(minor);

        /* since Vx.y (2.4?) macros defined in ioport.h,
           called is  __release_region()  */
#if defined(CAN_PORT_IO) 
	release_region(Base[minor], can_range[minor] );
#else
	release_region(Base[minor], can_range[minor] );
#endif

#ifdef CAN_USE_FILTER
	Can_FilterCleanup(minor);
#endif
	Can_FreeIrq(minor, IRQ[minor]);
#if !defined(CONFIG_PPC)
	/* printk("CAN module %d has been closed\n",minor); */
#endif

	if(Can_isopen[minor] > 0) {
	    --Can_isopen[minor];		/* flag device as free */
	    MOD_DEC_USE_COUNT;
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
	    return 0;
#endif
	}
	
    }
    DBGout();
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
    return -EBADF;
#endif
}
Example #2
0
/**
*
* \brief int close(int fd);
* close a file descriptor
* \param fd The descriptor to close.
*
* \b close closes a file descriptor, so that it no longer
*  refers to any device and may be reused.
* \returns
* close returns zero on success, or -1 if an error occurred.
* \par ERRORS
*
* the following errors can occur
*
* \arg \c BADF \b fd isn't a valid open file descriptor 
*

*/
__LDDK_CLOSE_TYPE can_close ( __LDDK_CLOSE_PARAM )
{
unsigned int minor = iminor(inode);

    DBGin("can_close");

    CAN_StopChip(minor);



#if !defined(PCM3680) && !defined(CPC_104) && !defined(CPC_PCM_104)
    /* call this before freeing any memory or io area.
     * this can contain registers needed by Can_FreeIrq()
     */
    Can_FreeIrq(minor, IRQ[minor]);


    /* should the resources be released in a manufacturer specific file?
     * is it always depending on the hardware?
     */

    /* since Vx.y (2.4?) macros defined in ioport.h,
       called is  __release_region()  */
#if defined(CAN_PORT_IO) && !defined(KVASER_PCICAN)
    release_region(Base[minor], can_range[minor]);
#else
# if defined(CAN_INDEXED_PORT_IO)
    release_region(Base[minor], 2);
# else
#  ifndef CAN4LINUX_PCI
    /* release I/O memory mapping -> release virtual memory */
    /* printk("iounmap %p \n", can_base[minor]); */
    iounmap(can_base[minor]);

    /* Release the memory region */
    /* printk("release mem %x \n", Base[minor]); */
    release_mem_region(Base[minor], can_range[minor]);

#  endif
# endif
#endif



#else  /* !defined(TARGETS with CAN_Release() in target.c */
    CAN_Release(minor);
#endif /* !defined(TARGETS with CAN_Release() in target.c */

#ifdef CAN_USE_FILTER
    Can_FilterCleanup(minor);
#endif

    /* printk("CAN module %d has been closed\n",minor); */

    if(Can_isopen[minor] > 0) {
	--Can_isopen[minor];		/* flag device as free */
	/* MOD_DEC_USE_COUNT; */
	DBGout();
	return 0;
    }

    DBGout();
    return -EBADF;
}