Modules/UDI - NSR layer and fixes to enumeration
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / core / cb.c
1 /**
2  * \file cb.c
3  * \author John Hodge (thePowersGang)
4  * \brief Control block code
5  */
6 #define DEBUG   1
7 #include <udi.h>
8 #include <acess.h>
9 #include <udi_internal.h>
10 #include <udi_internal_ma.h>    // for cUDI_MgmtCbInitList
11
12 // === CODE ===
13 udi_cb_t *udi_cb_alloc_internal_v(tUDI_MetaLang *Meta, udi_index_t MetaCBNum,
14         size_t inline_size, size_t scratch_size, udi_channel_t channel)
15 {
16         ASSERTC(MetaCBNum, <, Meta->nCbTypes);
17         size_t  base = Meta->CbTypes[MetaCBNum].Size;
18         ASSERTC(base, >=, sizeof(udi_cb_t));
19         base -= sizeof(udi_cb_t);
20         LOG("+ %i + %i + %i", base, inline_size, scratch_size);
21         udi_cb_t *ret = NEW(udi_cb_t, + base + inline_size + scratch_size);
22         ret->channel = channel;
23         ret->scratch = (void*)ret + sizeof(udi_cb_t) + base + inline_size;
24         return ret;
25 }
26 void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel)
27 {
28         const udi_cb_init_t     *cb_init;
29         LOG("Inst=%p, bind_cb_idx=%i, channel=%p", Inst, bind_cb_idx, channel);
30         ASSERT(Inst);
31         ASSERT(Inst->Module);
32         ASSERT(Inst->Module->InitInfo);
33         ASSERT(Inst->Module->InitInfo->cb_init_list);
34         
35         for( cb_init = Inst->Module->InitInfo->cb_init_list; cb_init->cb_idx; cb_init ++ )
36         {
37                 if( cb_init->cb_idx == bind_cb_idx )
38                 {
39                         // TODO: Get base size using meta/cbnum
40                         tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst->Module, cb_init->meta_idx);
41                         if( !metalang ) {
42                                 Log_Warning("UDI", "Metalang referenced in %s CB %i is invalid (%i)",
43                                         Inst->Module->ModuleName, bind_cb_idx, cb_init->meta_idx);
44                                 return NULL;
45                         }
46                         return udi_cb_alloc_internal_v(metalang, cb_init->meta_cb_num,
47                                 cb_init->inline_size, cb_init->scratch_requirement, channel);
48                         #if 0
49                         ASSERTC(cb_init->meta_cb_num, <, metalang->nCbTypes);
50                         size_t  base = metalang->CbTypes[cb_init->meta_cb_num].Size;
51                         ASSERTC(base, >=, sizeof(udi_cb_t));
52                         base -= sizeof(udi_cb_t);
53                         LOG("+ %i + %i + %i", base, cb_init->inline_size, cb_init->scratch_requirement);
54                         udi_cb_t *ret = NEW(udi_cb_t, + base
55                                 + cb_init->inline_size + cb_init->scratch_requirement);
56                         ret->channel = channel;
57                         ret->scratch = (void*)ret + sizeof(udi_cb_t) + base + cb_init->inline_size;
58                         return ret;
59                         #endif
60                 }
61         }
62         Log_Warning("UDI", "Cannot find CB init def %i for '%s'",
63                 bind_cb_idx, Inst->Module->ModuleName);
64         return NULL;
65 }
66
67 void udi_cb_alloc (
68         udi_cb_alloc_call_t     *callback,      //!< Function to be called when the CB is allocated
69         udi_cb_t        *gcb,   //!< Parent Control Block
70         udi_index_t     cb_idx,
71         udi_channel_t   default_channel
72         )
73 {
74         tUDI_DriverInstance *inst = UDI_int_ChannelGetInstance(gcb, false, NULL);
75         void *ret = udi_cb_alloc_internal(inst, cb_idx, default_channel);
76         callback(gcb, ret);
77 }
78
79 void udi_cb_alloc_dynamic(
80         udi_cb_alloc_call_t     *callback,
81         udi_cb_t        *gcb,
82         udi_index_t     cb_idx,
83         udi_channel_t   default_channel,
84         udi_size_t      inline_size,
85         udi_layout_t    *inline_layout
86         )
87 {
88         UNIMPLEMENTED();
89 }
90
91 void udi_cb_alloc_batch(
92         udi_cb_alloc_batch_call_t       *callback,      //!< 
93         udi_cb_t        *gcb,   //!< 
94         udi_index_t     cb_idx,
95         udi_index_t     count,
96         udi_boolean_t   with_buf,
97         udi_size_t      buf_size,
98         udi_buf_path_t  path_handle
99         )
100 {
101         UNIMPLEMENTED();
102 }
103
104 void udi_cb_free(udi_cb_t *cb)
105 {
106         // TODO: Ensure that cb is inactive
107         free(cb);
108 }
109
110 void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
111 {
112         UNIMPLEMENTED();
113 }
114
115 // === EXPORTS ===
116 EXPORT(udi_cb_alloc);
117 EXPORT(udi_cb_alloc_dynamic);
118 EXPORT(udi_cb_alloc_batch);
119 EXPORT(udi_cb_free);
120 EXPORT(udi_cancel);

UCC git Repository :: git.ucc.asn.au