2 * Acess2 UDI Environment (NIC Bindings)
3 * - By John Hodge (thePowersGang)
11 #ifndef UDI_NIC_VERSION
12 # error "UDI_NIC_VERSION must be defined"
16 #define UDI_NIC_STD_CB_NUM 1
17 #define UDI_NIC_BIND_CB_NUM 2
18 #define UDI_NIC_CTRL_CB_NUM 3
19 #define UDI_NIC_STATUS_CB_NUM 4
20 #define UDI_NIC_INFO_CB_NUM 5
21 #define UDI_NIC_TX_CB_NUM 6
22 #define UDI_NIC_RX_CB_NUM 7
28 #define UDI_NIC_MAC_ADDRESS_SIZE 20
30 #define UDI_NIC_ETHER 0
31 #define UDI_NIC_TOKEN 1
32 #define UDI_NIC_FASTETHER 2
33 #define UDI_NIC_GIGETHER 3
34 #define UDI_NIC_VGANYLAN 4
35 #define UDI_NIC_FDDI 5
38 #define UDI_NIC_MISCMEDIA 0xff
40 #define UDI_NIC_CAP_TX_IP_CKSUM (1U<<0)
41 #define UDI_NIC_CAP_TX_TCP_CKSUM (1U<<1)
42 #define UDI_NIC_CAP_TX_UDP_CKSUM (1U<<2)
43 #define UDI_NIC_CAP_MCAST_LOOPBK (1U<<3)
44 #define UDI_NIC_CAP_BCAST_LOOPBK (1U<<4)
45 // capabilities (requests)
46 #define UDI_NIC_CAP_USE_TX_CKSUM (1U<<30)
47 #define UDI_NIC_CAP_USE_RX_CKSUM (1U<<31)
50 udi_ubit8_t media_type;
51 udi_ubit32_t min_pdu_size;
52 udi_ubit32_t max_pdu_size;
53 udi_ubit32_t rx_hw_threshold;
54 udi_ubit32_t capabilities;
55 udi_ubit8_t max_perfect_multicast;
56 udi_ubit8_t max_total_multicast;
57 udi_ubit8_t mac_addr_len;
58 udi_ubit8_t mac_addr[UDI_NIC_MAC_ADDRESS_SIZE];
62 #define UDI_NIC_ADD_MULTI 1
63 #define UDI_NIC_DEL_MULTI 2
64 #define UDI_NIC_ALLMULTI_ON 3
65 #define UDI_NIC_ALLMULTI_OFF 4
66 #define UDI_NIC_GET_CURR_MAC 5
67 #define UDI_NIC_SET_CURR_MAC 6
68 #define UDI_NIC_GET_FACT_MAC 7
69 #define UDI_NIC_PROMISC_ON 8
70 #define UDI_NIC_PROMISC_OFF 9
71 #define UDI_NIC_HW_RESET 10
72 #define UDI_NIC_BAD_RXPKT 11
76 udi_ubit32_t indicator;
81 #define UDI_NIC_LINK_DOWN 0
82 #define UDI_NIC_LINK_UP 1
83 #define UDI_NIC_LINK_RESET 2
87 } udi_nic_status_cb_t;
91 udi_boolean_t interface_is_active;
92 udi_boolean_t link_is_active;
93 udi_boolean_t is_full_duplex;
94 udi_ubit32_t link_mbps;
95 udi_ubit32_t link_bps;
96 udi_ubit32_t tx_packets;
97 udi_ubit32_t rx_packets;
98 udi_ubit32_t tx_errors;
99 udi_ubit32_t rx_errors;
100 udi_ubit32_t tx_discards;
101 udi_ubit32_t rx_discards;
102 udi_ubit32_t tx_underrun;
103 udi_ubit32_t rx_overrun;
104 udi_ubit32_t collisions;
107 typedef struct udi_nic_tx_cb_s {
109 struct udi_nic_tx_cb_s *chain;
111 udi_boolean_t completion_urgent;
115 #define UDI_NIC_RX_BADCKSUM (1U<<0)
116 #define UDI_NIC_RX_UNDERRUN (1U<<1)
117 #define UDI_NIC_RX_OVERRUN (1U<<2)
118 #define UDI_NIC_RX_DRIBBLE (1U<<3)
119 #define UDI_NIC_RX_FRAME_ERR (1U<<4)
120 #define UDI_NIC_RX_MAC_ERR (1U<<5)
121 #define UDI_NIC_RX_OTHER_ERR (1U<<7)
123 #define UDI_NIC_RX_UNKNOWN 0
124 #define UDI_NIC_RX_EXACT 1
125 #define UDI_NIC_RX_HASH 2
126 #define UDI_NIC_RX_BROADCAST 3
128 #define UDI_NIC_RX_GOOD_IP_CKSUM (1U<<0)
129 #define UDI_NIC_RX_GOOD_TCP_CKSUM (1U<<1)
130 #define UDI_NIC_RX_GOOD_UDP_CKSUM (1U<<2)
131 typedef struct udi_nic_rx_cb_s {
133 struct udi_nic_rx_cb_s *chain;
135 udi_ubit8_t rx_status;
136 udi_ubit8_t addr_match;
137 udi_ubit8_t rx_valid;
140 // === Function Types ===
142 typedef void udi_nd_bind_req_op_t(udi_nic_bind_cb_t *cb, udi_index_t tx_chan_index, udi_index_t rx_chan_index);
143 typedef void udi_nsr_bind_ack_op_t(udi_nic_bind_cb_t *cb, udi_status_t status);
144 typedef void udi_nd_unbind_req_op_t(udi_nic_cb_t *cb);
145 typedef void udi_nsr_unbind_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
146 typedef void udi_nd_enable_req_op_t(udi_nic_cb_t *cb);
147 typedef void udi_nsr_enable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
148 typedef void udi_nd_disable_req_op_t(udi_nic_cb_t *cb);
149 typedef void udi_nsr_disable_ack_op_t(udi_nic_cb_t *cb, udi_status_t status);
150 typedef void udi_nd_ctrl_req_op_t(udi_nic_ctrl_cb_t *cb);
151 typedef void udi_nsr_ctrl_ack_op_t(udi_nic_ctrl_cb_t *cb, udi_status_t status);
152 typedef void udi_nsr_status_ind_op_t(udi_nic_status_cb_t *cb);
153 typedef void udi_nd_info_req_op_t(udi_nic_info_cb_t *cb, udi_boolean_t reset_statistics);
154 typedef void udi_nsr_info_ack_op_t(udi_nic_info_cb_t *cb);
156 typedef void udi_nsr_tx_rdy_op_t(udi_nic_tx_cb_t *cb);
157 typedef void udi_nd_tx_req_op_t(udi_nic_tx_cb_t *cb);
158 typedef void udi_nd_exp_tx_req_op_t(udi_nic_tx_cb_t *cb);
160 typedef void udi_nsr_rx_ind_op_t(udi_nic_rx_cb_t *cb);
161 typedef void udi_nsr_exp_rx_ind_op_t(udi_nic_rx_cb_t *cb);
162 typedef void udi_nd_rx_rdy_op_t(udi_nic_rx_cb_t *cb);
166 extern udi_nd_bind_req_op_t udi_nd_bind_req;
167 extern udi_nsr_bind_ack_op_t udi_nsr_bind_ack;
168 extern udi_nd_unbind_req_op_t udi_nd_unbind_req;
169 extern udi_nsr_unbind_ack_op_t udi_nsr_unbind_ack;
170 extern udi_nd_enable_req_op_t udi_nd_enable_req;
171 extern udi_nsr_enable_ack_op_t udi_nsr_enable_ack;
172 extern udi_nd_disable_req_op_t udi_nd_disable_req;
173 extern udi_nsr_disable_ack_op_t udi_nsr_disable_ack;
174 extern udi_nd_ctrl_req_op_t udi_nd_ctrl_req;
175 extern udi_nsr_ctrl_ack_op_t udi_nsr_ctrl_ack;
176 extern udi_nsr_status_ind_op_t udi_nsr_status_ind;
177 extern udi_nd_info_req_op_t udi_nd_info_req;
178 extern udi_nsr_info_ack_op_t udi_nsr_info_ack;
180 extern udi_nsr_tx_rdy_op_t udi_nsr_tx_rdy;
181 extern udi_nd_tx_req_op_t udi_nd_tx_req;
182 extern udi_nd_exp_tx_req_op_t udi_nd_exp_tx_req;
184 extern udi_nsr_rx_ind_op_t udi_nsr_rx_ind;
185 extern udi_nsr_exp_rx_ind_op_t udi_nsr_exp_rx_ind;
186 extern udi_nd_rx_rdy_op_t udi_nd_rx_rdy;
189 #define UDI_ND_CTRL_OPS_NUM 1
190 #define UDI_ND_TX_OPS_NUM 2
191 #define UDI_ND_RX_OPS_NUM 3
192 #define UDI_NSR_CTRL_OPS_NUM 4
193 #define UDI_NSR_TX_OPS_NUM 5
194 #define UDI_NSR_RX_OPS_NUM 6
196 typedef const struct {
197 udi_channel_event_ind_op_t *channel_event_ind_op;
198 udi_nd_bind_req_op_t *nd_bind_req_op;
199 udi_nd_unbind_req_op_t *nd_unbind_req_op;
200 udi_nd_enable_req_op_t *nd_enable_req_op;
201 udi_nd_disable_req_op_t *nd_disable_req_op;
202 udi_nd_ctrl_req_op_t *nd_ctrl_req_op;
203 udi_nd_info_req_op_t *nd_info_req_op;
206 typedef const struct {
207 udi_channel_event_ind_op_t *channel_event_ind_op;
208 udi_nd_tx_req_op_t *nd_tx_req_op;
209 udi_nd_exp_tx_req_op_t *nd_exp_tx_req_op;
212 typedef const struct {
213 udi_channel_event_ind_op_t *channel_event_ind_op;
214 udi_nd_rx_rdy_op_t *nd_rx_rdy_op;
217 typedef const struct {
218 udi_channel_event_ind_op_t *channel_event_ind_op;
219 udi_nsr_bind_ack_op_t *nsr_bind_ack_op;
220 udi_nsr_unbind_ack_op_t *nsr_unbind_ack_op;
221 udi_nsr_enable_ack_op_t *nsr_enable_ack_op;
222 udi_nsr_ctrl_ack_op_t *nsr_ctrl_ack_op;
223 udi_nsr_info_ack_op_t *nsr_info_ack_op;
224 udi_nsr_status_ind_op_t *nsr_status_ind_op;
225 } udi_nsr_ctrl_ops_t;
227 typedef const struct {
228 udi_channel_event_ind_op_t *channel_event_ind_op;
229 udi_nsr_tx_rdy_op_t *nsr_tx_rdy_op;
232 typedef const struct {
233 udi_channel_event_ind_op_t *channel_event_ind_op;
234 udi_nsr_rx_ind_op_t *nsr_rx_ind_op;
235 udi_nsr_exp_rx_ind_op_t *nsr_exp_rx_ind_op;