UDI/ne2000 - Incomplete TX implementation
[tpg/acess2.git] / UDI / drivers / net_ne2000 / ne2000_core.c
index f506661..71c0667 100644 (file)
@@ -21,17 +21,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 +36,7 @@ enum {
 // --- Management
 void ne2k_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
 {
+       udi_usage_res(cb);
 }
 void ne2k_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
 {
@@ -54,7 +52,7 @@ 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 ++;
@@ -75,11 +73,15 @@ 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
@@ -91,7 +93,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;
@@ -101,9 +102,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 )
@@ -118,8 +120,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)
 {
@@ -128,10 +132,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;
@@ -210,11 +222,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;
+       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)
@@ -243,6 +266,10 @@ void ne2k_bus_irq_intr_event_ind(udi_intr_event_cb_t *cb, udi_ubit8_t flags)
        {
                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);
 }
@@ -332,7 +359,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,
 };

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