Modules/UDI - Buffer delete, chained CB support
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / udi_nic.c
1 /**
2  * Acess2 UDI Layer
3  * - By John Hodge (thePowersGang)
4  *
5  * udi_lib/udi_nic.c
6  * - Network Interface metalanguage
7  */
8 #define DEBUG   1
9 #include <udi.h>
10 #include <udi_nic.h>
11 #include <acess.h>      // for EXPORT
12 #include <udi_internal.h>
13
14
15 extern udi_mei_init_t   udi_mei_info__nic;
16 #define udi_mei_info    udi_mei_info__nic
17
18 // === EXPORTS ===
19 EXPORT(udi_nd_bind_req);
20 EXPORT(udi_nsr_bind_ack);
21 EXPORT(udi_nd_unbind_req);
22 EXPORT(udi_nsr_unbind_ack);
23 EXPORT(udi_nd_enable_req);
24 EXPORT(udi_nsr_enable_ack);
25 EXPORT(udi_nd_disable_req);
26 EXPORT(udi_nd_ctrl_req);
27 EXPORT(udi_nsr_ctrl_ack);
28 EXPORT(udi_nsr_status_ind);
29 EXPORT(udi_nd_info_req);
30 EXPORT(udi_nsr_info_ack);
31 // - TX
32 EXPORT(udi_nsr_tx_rdy);
33 EXPORT(udi_nd_tx_req);
34 EXPORT(udi_nd_exp_tx_req);
35 // - RX
36 EXPORT(udi_nsr_rx_ind);
37 EXPORT(udi_nsr_exp_rx_ind);
38 EXPORT(udi_nd_rx_rdy);
39
40 // === CODE ===
41 // --- Control Ops ---
42 // ND - Network Device
43 UDI_MEI_STUBS(udi_nd_bind_req, udi_nic_bind_cb_t,
44         2, (tx_chan_index, rx_chan_index), (udi_index_t, udi_index_t), (UDI_VA_INDEX_T, UDI_VA_INDEX_T),
45         UDI_ND_CTRL_OPS_NUM, 1)
46 udi_layout_t    _udi_nd_bind_req_marshal_layout[] = { UDI_DL_INDEX_T, UDI_DL_INDEX_T, UDI_DL_END };
47
48 UDI_MEI_STUBS(udi_nd_unbind_req, udi_nic_cb_t,
49         0, (), (), (),
50         UDI_ND_CTRL_OPS_NUM, 2)
51 udi_layout_t    _udi_nd_unbind_req_marshal_layout[] = { UDI_DL_END };
52
53 UDI_MEI_STUBS(udi_nd_enable_req, udi_nic_cb_t,
54         0, (), (), (),
55         UDI_ND_CTRL_OPS_NUM, 3)
56 udi_layout_t    _udi_nd_enable_req_marshal_layout[] = { UDI_DL_END };
57
58 UDI_MEI_STUBS(udi_nd_disable_req, udi_nic_cb_t,
59         0, (), (), (),
60         UDI_ND_CTRL_OPS_NUM, 4)
61 udi_layout_t    _udi_nd_disable_req_marshal_layout[] = { UDI_DL_END };
62
63 UDI_MEI_STUBS(udi_nd_ctrl_req, udi_nic_ctrl_cb_t,
64         0, (), (), (),
65         UDI_ND_CTRL_OPS_NUM, 5)
66 udi_layout_t    _udi_nd_ctrl_req_marshal_layout[] = { UDI_DL_END };
67
68 UDI_MEI_STUBS(udi_nd_info_req, udi_nic_info_cb_t,
69         1, (reset_statistics), (udi_boolean_t), (UDI_VA_BOOLEAN_T),
70         UDI_ND_CTRL_OPS_NUM, 6)
71 udi_layout_t    _udi_nd_info_req_marshal_layout[] = { UDI_DL_BOOLEAN_T, UDI_DL_END };
72
73 // NSR - Network Service Requester
74 UDI_MEI_STUBS(udi_nsr_bind_ack, udi_nic_bind_cb_t,
75         1, (status), (udi_status_t), (UDI_VA_STATUS_T),
76         UDI_NSR_CTRL_OPS_NUM, 1)
77 udi_layout_t    _udi_nsr_bind_ack_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END };
78
79 UDI_MEI_STUBS(udi_nsr_unbind_ack, udi_nic_cb_t,
80         1, (status), (udi_status_t), (UDI_VA_STATUS_T),
81         UDI_NSR_CTRL_OPS_NUM, 2)
82 udi_layout_t    _udi_nsr_unbind_ack_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END };
83
84 UDI_MEI_STUBS(udi_nsr_enable_ack, udi_nic_cb_t,
85         1, (status), (udi_status_t), (UDI_VA_STATUS_T),
86         UDI_NSR_CTRL_OPS_NUM, 3)
87 udi_layout_t    _udi_nsr_enable_ack_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END };
88
89 UDI_MEI_STUBS(udi_nsr_ctrl_ack, udi_nic_ctrl_cb_t,
90         1, (status), (udi_status_t), (UDI_VA_STATUS_T),
91         UDI_NSR_CTRL_OPS_NUM, 4)
92 udi_layout_t    _udi_nsr_ctrl_ack_marshal_layout[] = { UDI_DL_STATUS_T, UDI_DL_END };
93
94 UDI_MEI_STUBS(udi_nsr_status_ind, udi_nic_status_cb_t,
95         0, (), (), (),
96         UDI_NSR_CTRL_OPS_NUM, 5)
97 udi_layout_t    _udi_nsr_status_ind_marshal_layout[] = { UDI_DL_END };
98
99 UDI_MEI_STUBS(udi_nsr_info_ack, udi_nic_info_cb_t,
100         0, (), (), (),
101         UDI_NSR_CTRL_OPS_NUM, 6)
102 udi_layout_t    _udi_nsr_info_ack_marshal_layout[] = { UDI_DL_END };
103
104 // --- TX ---
105 UDI_MEI_STUBS(udi_nsr_tx_rdy,  udi_nic_tx_cb_t, 0, (), (), (), UDI_NSR_TX_OPS_NUM, 1);
106 udi_layout_t    _udi_nsr_tx_rdy_marshal_layout[] = { UDI_DL_END };
107 UDI_MEI_STUBS(udi_nd_tx_req,  udi_nic_tx_cb_t, 0, (), (), (), UDI_ND_TX_OPS_NUM, 1);
108 udi_layout_t    _udi_nd_tx_req_marshal_layout[] = { UDI_DL_END };
109 UDI_MEI_STUBS(udi_nd_exp_tx_req,  udi_nic_tx_cb_t, 0, (), (), (), UDI_ND_TX_OPS_NUM, 2);
110 udi_layout_t    _udi_nd_exp_tx_req_marshal_layout[] = { UDI_DL_END };
111
112 // --- RX ---
113 UDI_MEI_STUBS(udi_nsr_rx_ind,     udi_nic_rx_cb_t, 0, (), (), (), UDI_NSR_RX_OPS_NUM, 1)
114 udi_layout_t    _udi_nsr_rx_ind_marshal_layout[] = { UDI_DL_END };
115 UDI_MEI_STUBS(udi_nsr_exp_rx_ind, udi_nic_rx_cb_t, 0, (), (), (), UDI_NSR_RX_OPS_NUM, 2)
116 udi_layout_t    _udi_nsr_exp_rx_ind_marshal_layout[] = { UDI_DL_END };
117 UDI_MEI_STUBS(udi_nd_rx_rdy, udi_nic_rx_cb_t, 0, (), (), (), UDI_ND_RX_OPS_NUM, 1)
118 udi_layout_t    _udi_nd_rx_rdy_marshal_layout[] = { UDI_DL_END };
119
120 #define UDI__OPS_NUM    0
121 #define MEI_OPINFO(name,cat,flags,cbtype,rsp_ops,rsp_idx,err_ops,err_idx)       \
122         {#name, UDI_MEI_OPCAT_##cat,flags,UDI_##cbtype##_CB_NUM, \
123                 UDI_##rsp_ops##_OPS_NUM,rsp_idx,UDI_##err_ops##_OPS_NUM,err_idx, \
124                 name##_direct, name##_backend, _##cbtype##_cb_layout, _##name##_marshal_layout }
125
126 // 1: UDI_NIC_STD_CB_NUM
127 udi_layout_t    _NIC_STD_cb_layout[] = {
128         UDI_DL_END
129 };
130 // 2: UDI_NIC_BIND_CB_NUM
131 udi_layout_t    _NIC_BIND_cb_layout[] = {
132         UDI_DL_UBIT8_T, // media_type
133         UDI_DL_UBIT32_T,        // min_pdu_size
134         UDI_DL_UBIT32_T,
135         UDI_DL_UBIT32_T,
136         UDI_DL_UBIT32_T,
137         UDI_DL_UBIT8_T, // max_perfect_multicast
138         UDI_DL_UBIT8_T,
139         UDI_DL_UBIT8_T, // mac_addr_len
140         UDI_DL_ARRAY,   // mac_addr
141                 UDI_NIC_MAC_ADDRESS_SIZE,
142                 UDI_DL_UBIT8_T,
143                 UDI_DL_END,
144         UDI_DL_END
145 };
146 // 3: UDI_NIC_CTRL_CB_NUM
147 udi_layout_t    _NIC_CTRL_cb_layout[] = {
148         UDI_DL_UBIT8_T, // command
149         UDI_DL_UBIT32_T,        // indicator
150         UDI_DL_BUF, 0,0,0,      // data_buf
151         UDI_DL_END
152         
153 };
154 // 4: UDI_NIC_STATUS_CB_NUM
155 udi_layout_t    _NIC_STATUS_cb_layout[] = {
156         UDI_DL_UBIT8_T,
157         UDI_DL_END
158 };
159 // 5: UDI_NIC_INFO_CB_NUM
160 udi_layout_t    _NIC_INFO_cb_layout[] = {
161         UDI_DL_BOOLEAN_T,       // interface_is_active
162         UDI_DL_BOOLEAN_T,       // link_is_active
163         UDI_DL_BOOLEAN_T,       // is_full_duplex
164         UDI_DL_UBIT32_T,        // link_mbps
165         UDI_DL_UBIT32_T,        // link_bps
166         UDI_DL_UBIT32_T,        // tx_packets
167         UDI_DL_UBIT32_T,        // rx_packets
168         UDI_DL_UBIT32_T,        // tx_errors
169         UDI_DL_UBIT32_T,        // rx_errors
170         UDI_DL_UBIT32_T,        // tx_discards
171         UDI_DL_UBIT32_T,        // rx_discards
172         UDI_DL_UBIT32_T,        // tx_underrun
173         UDI_DL_UBIT32_T,        // rx_underrun
174         UDI_DL_UBIT32_T,        // collisions
175         UDI_DL_END
176 };
177 // 6: UDI_NIC_RX_CB_NUM
178 udi_layout_t    _NIC_RX_cb_layout[] = {
179         UDI_DL_CB,      // chain
180         UDI_DL_BUF, 0, 0, 0,    // rx_buf
181         UDI_DL_UBIT8_T, // rx_status
182         UDI_DL_UBIT8_T, // addr_match
183         UDI_DL_UBIT8_T, // rx_valid
184         UDI_DL_END
185 };
186 // 7: UDI_NIC_TX_CB_NUM
187 udi_layout_t    _NIC_TX_cb_layout[] = {
188         UDI_DL_CB,      // chain
189         UDI_DL_BUF, 0, 0, 0,    // tx_buf
190         UDI_DL_BOOLEAN_T,       // completion_urgent
191         UDI_DL_END
192 };
193
194 udi_mei_op_template_t   udi_mei_info__nic__nd_ctrl_ops[] = {
195         MEI_OPINFO(udi_nd_bind_req, REQ, 0, NIC_BIND, NSR_CTRL,1, ,0),
196         MEI_OPINFO(udi_nd_unbind_req, REQ, 0, NIC_STD, NSR_CTRL,2, ,0),
197         MEI_OPINFO(udi_nd_enable_req, REQ, 0, NIC_STD, NSR_CTRL,3, ,0),
198         MEI_OPINFO(udi_nd_disable_req, REQ, 0, NIC_STD, ,0, ,0),
199         MEI_OPINFO(udi_nd_ctrl_req, REQ, 0, NIC_CTRL, NSR_CTRL,4, ,0),
200         MEI_OPINFO(udi_nd_info_req, REQ, 0, NIC_INFO, NSR_CTRL,5, ,0),
201         {0} 
202 };
203 udi_mei_op_template_t   udi_mei_info__nic__nsr_ctrl_ops[] = {
204         MEI_OPINFO(udi_nsr_bind_ack, ACK, 0, NIC_BIND, ,0, ,0),
205         MEI_OPINFO(udi_nsr_unbind_ack, ACK, 0, NIC_STD, ,0, ,0),
206         MEI_OPINFO(udi_nsr_enable_ack, ACK, 0, NIC_STD, ,0, ,0),
207         MEI_OPINFO(udi_nsr_ctrl_ack, ACK, 0, NIC_CTRL, ,0, ,0),
208         MEI_OPINFO(udi_nsr_info_ack, ACK, 0, NIC_INFO, ,0, ,0),
209         MEI_OPINFO(udi_nsr_status_ind, IND, 0, NIC_INFO, ,0, ,0),
210         {0}
211 };
212 udi_mei_op_template_t   udi_mei_info__nic__nd_tx_ops[] = {
213         MEI_OPINFO(udi_nd_tx_req, REQ, 0, NIC_TX, NSR_TX,1, ,0),
214         MEI_OPINFO(udi_nd_exp_tx_req, REQ, 0, NIC_TX, NSR_TX,1, ,0),
215         {0}
216 };
217 udi_mei_op_template_t   udi_mei_info__nic__nsr_tx_ops[] = {
218         MEI_OPINFO(udi_nsr_tx_rdy, RDY, 0, NIC_TX, ,0, ,0),
219         {0}
220 };
221 udi_mei_op_template_t   udi_mei_info__nic__nd_rx_ops[] = {
222         MEI_OPINFO(udi_nd_rx_rdy, RDY, 0, NIC_RX, ,0, ,0),
223         {0}
224 };
225 udi_mei_op_template_t   udi_mei_info__nic__nsr_rx_ops[] = {
226         MEI_OPINFO(udi_nsr_rx_ind, IND, 0, NIC_RX, ND_RX,1, ,0),
227         MEI_OPINFO(udi_nsr_exp_rx_ind, IND, 0, NIC_RX, ND_RX,1, ,0),
228         {0}
229 };
230
231 udi_mei_ops_vec_template_t      udi_mei_info__nic_ops[] = {
232         {UDI_ND_CTRL_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND|UDI_MEI_REL_INITIATOR, udi_mei_info__nic__nd_ctrl_ops},
233         {UDI_NSR_CTRL_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_BIND, udi_mei_info__nic__nsr_ctrl_ops},
234         {UDI_ND_TX_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR, udi_mei_info__nic__nd_tx_ops},
235         {UDI_NSR_TX_OPS_NUM, UDI_MEI_REL_EXTERNAL, udi_mei_info__nic__nsr_tx_ops},
236         {UDI_ND_RX_OPS_NUM, UDI_MEI_REL_EXTERNAL|UDI_MEI_REL_INITIATOR, udi_mei_info__nic__nd_rx_ops},
237         {UDI_NSR_RX_OPS_NUM, UDI_MEI_REL_EXTERNAL, udi_mei_info__nic__nsr_rx_ops},
238         {0}
239 };
240 udi_mei_init_t  udi_mei_info__nic = {
241         udi_mei_info__nic_ops,
242         NULL
243 };
244
245 tUDI_MetaLang   cMetaLang_NIC = {
246         "udi_nic",
247         &udi_mei_info__nic,
248         8,
249         {
250                 {0},
251                 {sizeof(udi_nic_cb_t),        0, _NIC_STD_cb_layout},
252                 {sizeof(udi_nic_bind_cb_t),   0, _NIC_BIND_cb_layout},
253                 {sizeof(udi_nic_ctrl_cb_t),   0, _NIC_CTRL_cb_layout},
254                 {sizeof(udi_nic_status_cb_t), 0, _NIC_STATUS_cb_layout},
255                 {sizeof(udi_nic_info_cb_t),   0, _NIC_INFO_cb_layout},
256                 {sizeof(udi_nic_tx_cb_t),     offsetof(udi_nic_tx_cb_t, chain), _NIC_TX_cb_layout},
257                 {sizeof(udi_nic_rx_cb_t),     offsetof(udi_nic_rx_cb_t, chain), _NIC_RX_cb_layout},
258         }
259 };

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