X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=UDI%2Fdrivers%2Fnet_ne2000%2Fne2000_core.c;h=d630a8d4abba32239321b2db36416dbbce5daf1b;hb=7e9bbefbdcbfdba27eb6cdacae0811f428483892;hp=acecb4983bc8a71f6e08c39099e0b14f0b9886c3;hpb=fb9d8f2d3c416bb3dc6702fae5891dedd990da44;p=tpg%2Facess2.git diff --git a/UDI/drivers/net_ne2000/ne2000_core.c b/UDI/drivers/net_ne2000/ne2000_core.c index acecb498..d630a8d4 100644 --- a/UDI/drivers/net_ne2000/ne2000_core.c +++ b/UDI/drivers/net_ne2000/ne2000_core.c @@ -5,8 +5,6 @@ * ne2000_core.c * - UDI initialisation */ -#include -#include #include "ne2000_common.h" enum { @@ -21,17 +19,14 @@ enum { NE2K_OPS_IRQ, }; enum { - NE2K_CB_INTR = 1, + NE2K_CB_BUS_BIND = 1, + NE2K_CB_INTR, NE2K_CB_INTR_EVENT, }; #define NE2K_NUM_INTR_EVENT_CBS 4 // === GLOBALS === -#define PIO_op_RI(op, reg, sz, val) {UDI_PIO_##op+UDI_PIO_DIRECT+UDI_PIO_##reg, UDI_PIO_##sz##BYTE, val} -#define PIO_MOV_RI1(reg, val) PIO_op_RI(LOAD_IMM, reg, 1, val) -#define PIO_OUT_RI1(reg, ofs) PIO_op_RI(OUT, reg, 1, ofs) -#define PIO_IN_RI1(reg, ofs) PIO_op_RI(IN, reg, 1, ofs) // --- Programmed IO --- #include "ne2000_pio.h" @@ -39,6 +34,11 @@ enum { // --- Management void ne2k_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level) { + ne2k_rdata_t *rdata = UDI_GCB(cb)->context; + + rdata->rx_next_page = NE2K_RX_FIRST_PG; + + udi_usage_res(cb); } void ne2k_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) { @@ -54,15 +54,19 @@ void ne2k_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level) attr_list ++; DPT_SET_ATTR_STRING(attr_list, "if_media", "eth", 3); attr_list ++; - NE2K_SET_ATTR_STRFMT(attr_list, "identifier", 2*6+1, "%2X%2X%2X%2X%2X%2X", + NE2K_SET_ATTR_STRFMT(attr_list, "identifier", 2*6+1, "%02X%02X%02X%02X%02X%02X", rdata->macaddr[0], rdata->macaddr[1], rdata->macaddr[2], rdata->macaddr[3], rdata->macaddr[4], rdata->macaddr[5] ); attr_list ++; + cb->attr_valid_length = attr_list - cb->attr_list; udi_enumerate_ack(cb, UDI_ENUMERATE_OK, NE2K_OPS_CTRL); break; case UDI_ENUMERATE_NEXT: udi_enumerate_ack(cb, UDI_ENUMERATE_DONE, 0); break; + default: + udi_assert(!"invalid enumeration_level"); + break; } } void ne2k_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID) @@ -74,15 +78,22 @@ void ne2k_final_cleanup_req(udi_mgmt_cb_t *cb) // --- Bus void ne2k_bus_dev_channel_event_ind(udi_channel_event_cb_t *cb) { + udi_cb_t *gcb = UDI_GCB(cb); + ne2k_rdata_t *rdata = gcb->context; + switch(cb->event) { case UDI_CHANNEL_CLOSED: break; case UDI_CHANNEL_BOUND: { + rdata->active_cb = gcb; udi_bus_bind_cb_t *bus_bind_cb = UDI_MCB(cb->params.parent_bound.bind_cb, udi_bus_bind_cb_t); udi_bus_bind_req( bus_bind_cb ); // continue at ne2k_bus_dev_bus_bind_ack return; } + default: + udi_assert(!"invalid channel event"); + break; } } void ne2k_bus_dev_bus_bind_ack(udi_bus_bind_cb_t *cb, @@ -90,7 +101,6 @@ void ne2k_bus_dev_bus_bind_ack(udi_bus_bind_cb_t *cb, { udi_cb_t *gcb = UDI_GCB(cb); ne2k_rdata_t *rdata = gcb->context; - rdata->active_cb = gcb; // Set up PIO handles rdata->init.pio_index = -1; @@ -100,9 +110,10 @@ void ne2k_bus_dev_bind__pio_map(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) { ne2k_rdata_t *rdata = gcb->context; - if( rdata->init.pio_index != -1 ) + if( rdata->init.pio_index != (udi_index_t)-1 ) { rdata->pio_handles[rdata->init.pio_index] = new_pio_handle; + udi_debug_printf("PIO %i = %p\n", rdata->init.pio_index, new_pio_handle); } rdata->init.pio_index ++; if( rdata->init.pio_index < NE2K_NUM_PIO_OPS ) @@ -117,8 +128,10 @@ void ne2k_bus_dev_bind__pio_map(udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) } // Next: Bind interrupt + // - spawn_idx = Interrupt number (0) udi_channel_spawn(ne2k_bus_dev_bind__intr_chanel, gcb, gcb->channel, 0, NE2K_OPS_IRQ, rdata); + // V V V V } void ne2k_bus_dev_bind__intr_chanel(udi_cb_t *gcb, udi_channel_t new_channel) { @@ -127,10 +140,18 @@ void ne2k_bus_dev_bind__intr_chanel(udi_cb_t *gcb, udi_channel_t new_channel) rdata->interrupt_channel = new_channel; udi_cb_alloc(ne2k_bus_dev_bind__intr_attach, gcb, NE2K_CB_INTR, gcb->channel); + // V V V V } void ne2k_bus_dev_bind__intr_attach(udi_cb_t *gcb, udi_cb_t *new_cb) { ne2k_rdata_t *rdata = gcb->context; + if( !new_cb ) + { + // Oh... + udi_channel_event_complete( UDI_MCB(rdata->active_cb, udi_channel_event_cb_t), + UDI_STAT_RESOURCE_UNAVAIL ); + return ; + } udi_intr_attach_cb_t *intr_cb = UDI_MCB(new_cb, udi_intr_attach_cb_t); intr_cb->interrupt_idx = 0; intr_cb->min_event_pend = 2; @@ -209,11 +230,22 @@ void ne2k_nd_ctrl_bind__tx_chan_ok(udi_cb_t *gcb, udi_channel_t new_channel) rdata->init.rx_chan_index, NE2K_OPS_RX, rdata); // V V V V } -void ne2k_nd_ctrl_bind__rx_chan_ok(udi_cb_t *cb, udi_channel_t new_channel) +void ne2k_nd_ctrl_bind__rx_chan_ok(udi_cb_t *gcb, udi_channel_t new_channel) { - ne2k_rdata_t *rdata = cb->context; + ne2k_rdata_t *rdata = gcb->context; rdata->rx_channel = new_channel; - udi_nsr_bind_ack( UDI_MCB(cb, udi_nic_bind_cb_t), UDI_OK ); + + udi_nic_bind_cb_t *cb = UDI_MCB(gcb, udi_nic_bind_cb_t); + cb->media_type = UDI_NIC_ETHER; + cb->min_pdu_size = 0; + cb->max_pdu_size = 0; + cb->rx_hw_threshold = 2; + cb->capabilities = 0; + cb->max_perfect_multicast = 0; + cb->max_total_multicast = 0; + cb->mac_addr_len = 6; + udi_memcpy(cb->mac_addr, rdata->macaddr, 6); + udi_nsr_bind_ack( cb, UDI_OK ); // = = = = } void ne2k_nd_ctrl_unbind_req(udi_nic_cb_t *cb) @@ -221,7 +253,14 @@ void ne2k_nd_ctrl_unbind_req(udi_nic_cb_t *cb) } void ne2k_nd_ctrl_enable_req(udi_nic_cb_t *cb) { - // Enable + udi_cb_t *gcb = UDI_GCB(cb); + ne2k_rdata_t *rdata = gcb->context; + udi_pio_trans(ne2k_nd_ctrl_enable_req__trans_done, gcb, + rdata->pio_handles[NE2K_PIO_ENABLE], 0, NULL, NULL); +} +void ne2k_nd_ctrl_enable_req__trans_done(udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit16_t res) +{ + udi_nsr_enable_ack( UDI_MCB(gcb, udi_nic_cb_t), status ); } void ne2k_nd_ctrl_disable_req(udi_nic_cb_t *cb) { @@ -238,10 +277,17 @@ void ne2k_bus_irq_channel_event_ind(udi_channel_event_cb_t *cb) } void ne2k_bus_irq_intr_event_ind(udi_intr_event_cb_t *cb, udi_ubit8_t flags) { + udi_debug_printf("ne2k_bus_irq_intr_event_ind: flags=%x, intr_result=%x\n", + flags, cb->intr_result); if( cb->intr_result & 0x01 ) { ne2k_intr__rx_ok( UDI_GCB(cb) ); } + if( cb->intr_result & 0x40 ) + { + // ne2k_intr__rdma( UDI_GCB(cb) ); + } + // TODO: TX IRQs udi_intr_event_rdy(cb); } @@ -330,7 +376,14 @@ udi_ops_init_t ne2k_ops_list[] = { }, {0} }; +udi_cb_init_t ne2k_cb_init_list[] = { + {NE2K_CB_BUS_BIND, NE2K_META_BUS, UDI_BUS_BIND_CB_NUM, 0, 0,NULL}, + {NE2K_CB_INTR, NE2K_META_BUS, UDI_BUS_INTR_ATTACH_CB_NUM, 0, 0,NULL}, + {NE2K_CB_INTR_EVENT, NE2K_META_BUS, UDI_BUS_INTR_EVENT_CB_NUM, 0, 0,NULL}, + {0} +}; const udi_init_t udi_init_info = { .primary_init_info = &ne2k_pri_init, - .ops_init_list = ne2k_ops_list + .ops_init_list = ne2k_ops_list, + .cb_init_list = ne2k_cb_init_list, };