#endif
#endif
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36))
+static int can_oldapi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+ return can_ioctl(file, cmd, arg);
+}
+#endif /* 2.6.36 */
+
/* Pointers to dynamically allocated memory are maintained in a linked list
* to ease memory deallocation.
*/
read: can_read,
write: can_write,
poll: can_poll,
- ioctl: can_ioctl,
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36))
+ ioctl: can_oldapi_ioctl,
+ #else /* Linux 3.x */
+ unlocked_ioctl: can_ioctl,
+ #endif /* Linux 3.x */
open: can_open,
release: can_close,
#ifdef CAN_ENABLE_KERN_FASYNC
res = usbcan_init();
if (res){
CANMSG("usb_register for usbcan failed. Error number %d.\n", res);
- return -ENODEV;
+ goto memory_error;
}
#endif
-
-struct candevice_t* register_hotplug_dev(const char *hwname,void *devdata,void (*chipdataregfnc)(struct canchip_t *ch,void *data)){
+struct candevice_t* register_hotplug_dev(const char *hwname,int (*chipdataregfnc)(struct canchip_t *ch,void *data),void *devdata){
int i=0, j, board=0;
struct candevice_t *candev;
struct canchip_t *chip;
}
brp = boardtype_find(hwname);
if(!brp) {
- CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hw[board]);
+ CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hwname);
return NULL;
}
if (board==MAX_HW_CARDS){
- CANMSG("Device \"%s\" could not be registered due to internal limits.\n",hw[board]);
+ CANMSG("Device \"%s\" could not be registered due to internal limits.\n",hwname);
return NULL;
}
hw[board]=brp->boardtype;
- if (init_new_hw_struct(board))
+ if (init_new_hw_struct(board)){
+ CANMSG("HW struct creation failed.\n");
return NULL;
+ }
#ifdef CAN_DEBUG
list_hw();
if((chip=candev->chip[j])==NULL)
continue;
- chipdataregfnc(chip,devdata);
+ if (chipdataregfnc && devdata){
+ if (chipdataregfnc(chip,devdata))
+ goto interrupt_error;
+ }
if(chip->chipspecops->attach_to_chip(chip)<0) {
CANMSG("Initial attach to the chip HW failed\n");
CANMSG("Error to program board interrupt\n");
goto interrupt_error;
}
-
+ CANMSG("Registering /proc entry\n");
#ifdef CONFIG_PROC_FS
if (can_init_procentry(board))
goto proc_error;
#endif /*CAN_WITH_RTL*/
// register_error:
- if ( can_del_mem_list() )
- CANMSG("Error deallocating memory\n");
+// if ( can_del_mem_list() )
+// CANMSG("Error deallocating memory\n");
return NULL;
}
-void cleanup_hotplug_dev(struct candevice_t *dev)
+void deregister_hotplug_dev(struct candevice_t *dev)
{
int i=0;
int dev_minor;
if (!dev)
return;
+ DEBUGMSG("Deregistering hotplug device.\n");
#ifdef CONFIG_PROC_FS
if (can_delete_procentry(dev))
}
#endif
+}
+
+
+void cleanup_hotplug_dev(struct candevice_t *dev)
+{
+ int i=0;
+ int dev_minor;
+
+ if (!dev)
+ return;
+ DEBUGMSG("Cleaning up hotplug device.\n");
+
for(i=0;i<MAX_TOT_CHIPS;i++){
if(!chips_p[i]) continue;
if(chips_p[i]->hostdevice != dev) continue;
#endif
#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
+ DEBUGMSG("Unregistering usbcan.\n");
usbcan_exit();
#endif
+ DEBUGMSG("Continuing with coldplug cleanup.\n");
#ifdef CONFIG_PROC_FS
if (can_delete_procdir())
CANMSG("Error unregistering /proc/can entry.\n");
canqueue_rtl_done();
#endif /*CAN_WITH_RTL*/
+ DEBUGMSG("Can hardware cleanup done, freeing memory.\n");
+
if ( can_del_mem_list() )
CANMSG("Error deallocating memory\n");