2 * UDI Ne2000 NIC Driver
3 * By John Hodge (thePowersGang)
10 #include "ne2000_common.h"
12 #define NE2K_META_BUS 1
13 #define NE2K_META_NIC 2
17 void ne2k_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
20 void ne2k_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
22 udi_instance_attr_list_t *attr_list = cb->attr_list;
24 switch(enumeration_level)
26 case UDI_ENUMERATE_START:
27 case UDI_ENUMERATE_START_RESCAN:
28 // TODO: Emit the ND binding
29 DPT_SET_ATTR32(attr_list, "if_num", 0);
31 DPT_SET_ATTR_STRING(attr_list, "if_media", "eth");
33 //DPT_SET_ATTR_STRING(attr_list, "identifier", hexaddr);
35 udi_enumerate_ack(cb, UDI_ENUMERATE_OK, 2);
37 case UDI_ENUMERATE_NEXT:
38 udi_enumerate_ack(cb, UDI_ENUMERATE_DONE, 0);
42 void ne2k_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID)
45 void ne2k_final_cleanup_req(udi_mgmt_cb_t *cb)
49 void ne2k_bus_dev_channel_event_ind(udi_channel_event_cb_t *cb)
52 void ne2k_bus_dev_bus_bind_ack(udi_bus_bind_cb_t *cb,
53 udi_dma_constraints_t dma_constraints, udi_ubit8_t perferred_endianness, udi_status_t status)
56 void ne2k_bus_dev_bus_unbind_ack(udi_bus_bind_cb_t *cb)
59 void ne2k_bus_dev_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
62 void ne2k_bus_dev_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
66 void ne2k_nd_ctrl_channel_event_ind(udi_channel_event_cb_t *cb)
69 void ne2k_nd_ctrl_bind_req(udi_nic_bind_cb_t *cb, udi_index_t tx_chan_index, udi_index_t rx_chan_index)
72 void ne2k_nd_ctrl_unbind_req(udi_nic_cb_t *cb)
75 void ne2k_nd_ctrl_enable_req(udi_nic_cb_t *cb)
78 void ne2k_nd_ctrl_disable_req(udi_nic_cb_t *cb)
81 void ne2k_nd_ctrl_ctrl_req(udi_nic_ctrl_cb_t *cb)
84 void ne2k_nd_ctrl_info_req(udi_nic_info_cb_t *cb, udi_boolean_t reset_statistics)
88 // === Definition structures ===
89 udi_mgmt_ops_t ne2k_mgmt_ops = {
93 ne2k_final_cleanup_req
95 udi_ubit8_t ne2k_mgmt_op_flags[4] = {0,0,0,0};
96 udi_bus_device_ops_t ne2k_bus_dev_ops = {
97 ne2k_bus_dev_channel_event_ind,
98 ne2k_bus_dev_bus_bind_ack,
99 ne2k_bus_dev_bus_unbind_ack,
100 ne2k_bus_dev_intr_attach_ack,
101 ne2k_bus_dev_intr_detach_ack
103 udi_ubit8_t ne2k_bus_dev_ops_flags[5] = {0};
104 udi_nd_ctrl_ops_t ne2k_nd_ctrl_ops = {
105 ne2k_nd_ctrl_channel_event_ind,
106 ne2k_nd_ctrl_bind_req,
107 ne2k_nd_ctrl_unbind_req,
108 ne2k_nd_ctrl_enable_req,
109 ne2k_nd_ctrl_disable_req,
110 ne2k_nd_ctrl_ctrl_req,
111 ne2k_nd_ctrl_info_req
113 udi_ubit8_t ne2k_nd_ctrl_ops_flags[7] = {0};
114 udi_nd_tx_ops ne2k_nd_tx_ops = {
115 ne2k_nd_tx_channel_event_ind,
117 ne2k_nd_tx_exp_tx_req
119 udi_ubit8_t ne2k_nd_tx_ops_flags[3] = {0};
120 udi_nd_rx_ops ne2k_nd_rx_ops = {
121 ne2k_nd_rx_channel_event_ind,
124 udi_ubit8_t ne2k_nd_rx_ops_flags[2] = {0};
125 const udi_primary_init_t ne2k_pri_init = {
126 .mgmt_ops = &ne2k_mgmt_ops,
127 .mgmt_op_flags = ne2k_mgmt_op_flags,
128 .mgmt_scratch_requirement = 0,
129 .enumeration_attr_list_length = 4,
130 .rdata_size = sizeof(ne2k_rdata_t),
131 .child_data_size = 0,
132 .per_parent_paths = 0
134 const udi_ops_init_t ne2k_ops_list[] = {
136 1, NE2K_META_BUS, UDI_BUS_DEVICE_OPS_NUM,
138 (udi_ops_vector_t*)ne2k_bus_dev_ops,
139 ne2k_bus_dev_ops_flags
142 2, NE2K_META_NIC, UDI_ND_CTRL_OPS_NUM,
144 (udi_ops_vector_t*)ne2k_nd_ctrl_ops,
145 ne2k_nd_ctrl_ops_flags
148 3, NE2K_META_NIC, UDI_ND_TX_OPS_NUM,
150 (udi_ops_vector_t*)ne2k_nd_tx_ops,
154 4, NE2K_META_NIC, UDI_ND_RX_OPS_NUM,
156 (udi_ops_vector_t*)ne2k_nd_rx_ops,
161 const udi_init_t udi_init_info = {
162 .primary_init_info = &ne2k_pri_init,
163 .ops_init_list = ne2k_ops_list