X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/91dfab84182937b62ef64cb12d8e4f89e6d5c3ec..fdc4d3610737d153a387bdb67792a323806efad3:/lincan/src/finish.c diff --git a/lincan/src/finish.c b/lincan/src/finish.c index fdca959..532d868 100644 --- a/lincan/src/finish.c +++ b/lincan/src/finish.c @@ -1,3 +1,12 @@ +/* finish.c - finalization of the driver operation + * Linux CAN-bus device driver. + * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * Rewritten for new CAN queues by Pavel Pisa - OCERA team member + * email:pisa@cmp.felk.cvut.cz + * This software is released under the GPL-License. + * Version lincan-0.3 17 Jun 2004 + */ + #include "../include/can.h" #include "../include/can_sysdep.h" #include "../include/main.h" @@ -6,7 +15,10 @@ #include "../include/setup.h" - +/** + * msgobj_done - destroys one CAN message object + * @obj: pointer to CAN message object structure + */ void msgobj_done(struct msgobj_t *obj) { int delayed=0; @@ -20,17 +32,17 @@ void msgobj_done(struct msgobj_t *obj) if(obj->hostchip->msgobj[obj->object-1] == obj) obj->hostchip->msgobj[obj->object-1]=NULL; else - CANMSG("msgobj_done: not registered in the chip_t\n"); + CANMSG("msgobj_done: not registered in the canchip_t\n"); obj->hostchip=NULL; } - + if((obj->minor>=0)) { if(objects_p[obj->minor] == obj) objects_p[obj->minor] = NULL; else CANMSG("msgobj_done: not registered as minor\n"); } - + del_timer_sync(&obj->tx_timeout); if(obj->qends) { @@ -44,12 +56,19 @@ void msgobj_done(struct msgobj_t *obj) } -void canchip_done(struct chip_t *chip) +/** + * canchip_done - destroys one CAN chip representation + * @chip: pointer to CAN chip structure + */ +void canchip_done(struct canchip_t *chip) { int i; struct msgobj_t *obj; + if(chip->flags & CHIP_ATTACHED) + chip->chipspecops->release_chip(chip); + if((chip->hostdevice) && (chip->chip_idx>=0)) { if(chip->hostdevice->chip[chip->chip_idx] == chip) chip->hostdevice->chip[chip->chip_idx] = NULL; @@ -57,36 +76,37 @@ void canchip_done(struct chip_t *chip) CANMSG("canchip_done: not registered in hostdevice\n"); } - if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)) { - free_irq(chip->chip_irq, chip); - chip->flags &= ~CHIP_IRQ_SETUP; - } - + can_chip_free_irq(chip); + can_synchronize_irq(chip->chip_irq); - + for(i=0; imax_objects; i++){ if((obj=chip->msgobj[i])==NULL) continue; msgobj_done(obj); can_checked_free(obj); } - + can_checked_free(chip->chipspecops); chip->chipspecops=NULL; } +/** + * candevice_done - destroys representation of one CAN device/board + * @candev: pointer to CAN device/board structure + */ void candevice_done(struct candevice_t *candev) { int i; - struct chip_t *chip; - + struct canchip_t *chip; + for(i=0; inr_all_chips; i++){ if((chip=candev->chip[i])==NULL) continue; canchip_done(chip); can_checked_free(chip); - + } if(candev->flags & CANDEV_IO_RESERVED) { candev->hwspecops->release_io(candev); @@ -96,11 +116,15 @@ void candevice_done(struct candevice_t *candev) candev->hwspecops=NULL; } +/** + * candevice_done - destroys representation of all CAN devices/boards + * @canhw: pointer to the root of all CAN hardware representation + */ void canhardware_done(struct canhardware_t *canhw) { int i; struct candevice_t *candev; - + for(i=0; inr_boards; i++){ if((candev=canhw->candevice[i])==NULL) continue;