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((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");
#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;
}
if (!dev)
return;
+ DEBUGMSG("Cleaning up hotplug device.\n");
#ifdef CONFIG_PROC_FS
if (can_delete_procentry(dev))
#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");