1 /* finish.c - finalization of the driver operation
2 * Linux CAN-bus device driver.
3 * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
4 * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
5 * email:pisa@cmp.felk.cvut.cz
6 * This software is released under the GPL-License.
7 * Version lincan-0.3 17 Jun 2004
10 #include "../include/can.h"
11 #include "../include/can_sysdep.h"
12 #include "../include/main.h"
13 #include "../include/devcommon.h"
14 #include "../include/finish.h"
15 #include "../include/setup.h"
17 extern int next_minor;
19 * msgobj_done - destroys one CAN message object
20 * @obj: pointer to CAN message object structure
22 void msgobj_done(struct msgobj_t *obj)
26 delayed=canqueue_ends_done_chip(obj->qends);
28 CANMSG("msgobj_done: problem with chip queue ends\n");
31 if((obj->hostchip) && (obj->object>0)) {
32 if(obj->hostchip->msgobj[obj->object-1] == obj)
33 obj->hostchip->msgobj[obj->object-1]=NULL;
35 CANMSG("msgobj_done: not registered in the canchip_t\n");
40 if(objects_p[obj->minor] == obj){
41 objects_p[obj->minor] = NULL;
46 CANMSG("msgobj_done: not registered as minor\n");
49 del_timer_sync(&obj->tx_timeout);
52 /*delayed free could be required there in the future,
53 actual use patter cannot generate such situation*/
55 can_checked_free(obj->qends);
63 * canchip_done - destroys one CAN chip representation
64 * @chip: pointer to CAN chip structure
66 void canchip_done(struct canchip_t *chip)
72 if(chip->flags & CHIP_ATTACHED){
73 chip->chipspecops->release_chip(chip);
74 chip->flags &= ~CHIP_ATTACHED;
77 if((chip->hostdevice) && (chip->chip_idx>=0)) {
78 if(chip->hostdevice->chip[chip->chip_idx] == chip)
79 chip->hostdevice->chip[chip->chip_idx] = NULL;
81 CANMSG("canchip_done: not registered in hostdevice\n");
84 can_chip_free_irq(chip);
86 can_synchronize_irq(chip->chip_irq);
88 for(i=0; i<chip->max_objects; i++){
89 if((obj=chip->msgobj[i])==NULL)
92 can_checked_free(obj);
95 can_checked_free(chip->chipspecops);
96 chip->chipspecops=NULL;
101 * candevice_done - destroys representation of one CAN device/board
102 * @candev: pointer to CAN device/board structure
104 void candevice_done(struct candevice_t *candev)
107 struct canchip_t *chip;
109 for(i=0; i<candev->nr_all_chips; i++){
110 if((chip=candev->chip[i])==NULL)
113 can_checked_free(chip);
116 if(candev->flags & CANDEV_IO_RESERVED) {
117 candev->hwspecops->release_io(candev);
118 candev->flags &= ~CANDEV_IO_RESERVED;
120 can_checked_free(candev->hwspecops);
121 candev->hwspecops=NULL;
125 * candevice_done - destroys representation of all CAN devices/boards
126 * @canhw: pointer to the root of all CAN hardware representation
128 void canhardware_done(struct canhardware_t *canhw)
131 struct candevice_t *candev;
133 for(i=0; i<MAX_HW_CARDS; i++){
134 if((candev=canhw->candevice[i])==NULL)
136 candevice_done(candev);
137 can_checked_free(candev);