extern int can_rtl_priority;
#endif /*CAN_WITH_RTL*/
-extern struct candevice_t* register_hotplug_dev(const char *hwname,void *devdata,void (*chipdataregfnc)(struct canchip_t *chip,void *data));
+extern struct candevice_t* register_hotplug_dev(const char *hwname,int (*chipdataregfnc)(struct canchip_t *chip,void *data),void *devdata);
extern void cleanup_hotplug_dev(struct candevice_t *dev);
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");
*
* File: src/usbcan.c
*/
-void usbcan_register_devs(struct canchip_t *chip,void *data){
+int usbcan_register_devs(struct canchip_t *chip,void *data){
struct usbcan_devs *usbdevs=(struct usbcan_devs *)data;
if (!usbdevs){
CANMSG("Bad structure given\n");
- return;
+ return -1;
}
if (chip->chip_idx>=usbdevs->count) {
CANMSG("Requested chip number is bigger than chip count\n");
- return;
+ return -1;
}
usbdevs->devs[chip->chip_idx]->chip=chip;
chip->chip_data=(void *)usbdevs->devs[chip->chip_idx];
+ return 0;
}
/**
/* save our data pointer in this interface device */
usb_set_intfdata(interface, usbdevs);
- if (!(usbdevs->candev=register_hotplug_dev("usbcan",(void *) usbdevs, usbcan_register_devs)))
+ if (!(usbdevs->candev=register_hotplug_dev("usbcan", usbcan_register_devs,(void *) usbdevs)))
goto register_error;
/* let the user know what node this device is now attached to */