/** * * \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 }
/** * * \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; }