]> rtime.felk.cvut.cz Git - lincan.git/blob - lincan/src/finish.c
fdca959e807692ceddeaba8a2996e4d67d8b9076
[lincan.git] / lincan / src / finish.c
1 #include "../include/can.h"
2 #include "../include/can_sysdep.h"
3 #include "../include/main.h"
4 #include "../include/devcommon.h"
5 #include "../include/finish.h"
6 #include "../include/setup.h"
7
8
9
10 void msgobj_done(struct msgobj_t *obj)
11 {
12         int delayed=0;
13         if(obj->qends) {
14                 delayed=canqueue_ends_done_chip(obj->qends);
15                 if(delayed < 0)
16                         CANMSG("msgobj_done: problem with chip queue ends\n");
17         }
18
19         if((obj->hostchip) && (obj->object>0)) {
20                 if(obj->hostchip->msgobj[obj->object-1] == obj)
21                         obj->hostchip->msgobj[obj->object-1]=NULL;
22                 else
23                         CANMSG("msgobj_done: not registered in the chip_t\n");
24                 obj->hostchip=NULL;
25         }
26         
27         if((obj->minor>=0)) {
28                 if(objects_p[obj->minor] == obj)
29                         objects_p[obj->minor] = NULL;
30                 else
31                         CANMSG("msgobj_done: not registered as minor\n");
32         }
33         
34         del_timer_sync(&obj->tx_timeout);
35
36         if(obj->qends) {
37                 /*delayed free could be required there in the future,
38                   actual use patter cannot generate such situation*/
39                 if(!delayed) {
40                         can_checked_free(obj->qends);
41                 }
42         }
43         obj->qends=NULL;
44 }
45
46
47 void canchip_done(struct chip_t *chip)
48 {
49
50         int i;
51         struct msgobj_t *obj;
52
53         if((chip->hostdevice) && (chip->chip_idx>=0)) {
54                 if(chip->hostdevice->chip[chip->chip_idx] == chip)
55                         chip->hostdevice->chip[chip->chip_idx] = NULL;
56                 else
57                         CANMSG("canchip_done: not registered in hostdevice\n");
58         }
59
60         if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)) {
61                 free_irq(chip->chip_irq, chip);
62                 chip->flags &= ~CHIP_IRQ_SETUP;
63         }
64                 
65         can_synchronize_irq(chip->chip_irq);
66         
67         for(i=0; i<chip->max_objects; i++){
68                 if((obj=chip->msgobj[i])==NULL)
69                         continue;
70                 msgobj_done(obj);
71                 can_checked_free(obj);
72         }
73         
74         can_checked_free(chip->chipspecops);
75         chip->chipspecops=NULL;
76
77 }
78
79 void candevice_done(struct candevice_t *candev)
80 {
81         int i;
82         struct chip_t *chip;
83         
84         for(i=0; i<candev->nr_all_chips; i++){
85                 if((chip=candev->chip[i])==NULL)
86                         continue;
87                 canchip_done(chip);
88                 can_checked_free(chip);
89         
90         }
91         if(candev->flags & CANDEV_IO_RESERVED) {
92                 candev->hwspecops->release_io(candev);
93                 candev->flags &= ~CANDEV_IO_RESERVED;
94         }
95         can_checked_free(candev->hwspecops);
96         candev->hwspecops=NULL;
97 }
98
99 void canhardware_done(struct canhardware_t *canhw)
100 {
101         int i;
102         struct candevice_t *candev;
103         
104         for(i=0; i<canhw->nr_boards; i++){
105                 if((candev=canhw->candevice[i])==NULL)
106                         continue;
107                 candevice_done(candev);
108                 can_checked_free(candev);
109         }
110
111 }