From 772a6327b1f7b0b79aee21c63472eac28d91c51d Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 13 Oct 2013 10:07:00 +0800 Subject: [PATCH] UDI/ne2000 - RX working (not fully tested) --- UDI/drivers/net_ne2000/ne2000_core.c | 4 +++ UDI/drivers/net_ne2000/ne2000_pio.h | 39 +++++++++++++++------------- UDI/drivers/net_ne2000/ne2000_rx.c | 21 ++++++++++++--- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/UDI/drivers/net_ne2000/ne2000_core.c b/UDI/drivers/net_ne2000/ne2000_core.c index e7b88869..2e44db18 100644 --- a/UDI/drivers/net_ne2000/ne2000_core.c +++ b/UDI/drivers/net_ne2000/ne2000_core.c @@ -36,6 +36,10 @@ 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) diff --git a/UDI/drivers/net_ne2000/ne2000_pio.h b/UDI/drivers/net_ne2000/ne2000_pio.h index 35040863..2f6acd7f 100644 --- a/UDI/drivers/net_ne2000/ne2000_pio.h +++ b/UDI/drivers/net_ne2000/ne2000_pio.h @@ -107,10 +107,10 @@ udi_pio_trans_t ne2k_pio_rx[] = { // - Clear RDMA flag PIO_MOV_RI1(R0, 0x40), PIO_OUT_RI1(R0, NE2K_REG_ISR), // - Set up transaction for 1 page from CurRX - PIO_MOV_RI1(R0, 1), - PIO_MOV_RI1(R1, 0), - PIO_OUT_RI1(R7, NE2K_REG_RSAR0), // Current RX page - PIO_OUT_RI1(R1, NE2K_REG_RSAR1), + PIO_MOV_RI1(R0, 0), + PIO_MOV_RI1(R1, 1), + PIO_OUT_RI1(R0, NE2K_REG_RSAR0), + PIO_OUT_RI1(R7, NE2K_REG_RSAR1), // Current RX page PIO_OUT_RI1(R0, NE2K_REG_RBCR0), PIO_OUT_RI1(R1, NE2K_REG_RBCR1), // - Start read @@ -119,42 +119,45 @@ udi_pio_trans_t ne2k_pio_rx[] = { // > Header to registers {UDI_PIO_IN|UDI_PIO_DIRECT|UDI_PIO_R6, UDI_PIO_2BYTE, NE2K_REG_MEM}, // Status,NextPacketPage {UDI_PIO_IN|UDI_PIO_DIRECT|UDI_PIO_R5, UDI_PIO_2BYTE, NE2K_REG_MEM}, // Length (bytes) + {UDI_PIO_STORE|UDI_PIO_DIRECT|UDI_PIO_R4, UDI_PIO_2BYTE, UDI_PIO_R5}, // save length until return // > Data to buffer (126 words) - PIO_MOV_RI1(R4, 0), // - Buffer offset (incremented by 1 each iteration) + PIO_MOV_RI1(R0, 0), // - Buffer offset (incremented by 1 each iteration) PIO_MOV_RI1(R1, NE2K_REG_MEM), // - Reg offset (no increment) - PIO_MOV_RI1(R2, 256/2-2), // - Six iterations + PIO_MOV_RI1(R2, 256/2-2), {UDI_PIO_REP_IN_IND, UDI_PIO_2BYTE, - UDI_PIO_REP_ARGS(UDI_PIO_BUF, UDI_PIO_R4, 2, UDI_PIO_R1, 0, UDI_PIO_R2)}, + UDI_PIO_REP_ARGS(UDI_PIO_BUF, UDI_PIO_R0, 1, UDI_PIO_R1, 0, UDI_PIO_R2)}, + PIO_MOV_RI1(R3, 256-4), // - Subtract 256-4 from length, if <=0 we've grabbed the entire packet - {UDI_PIO_SUB|UDI_PIO_R5, UDI_PIO_2BYTE, 256-4}, + {UDI_PIO_ADD_IMM|UDI_PIO_R5, UDI_PIO_2BYTE, -(256-4)}, {UDI_PIO_LABEL, 0, 2}, {UDI_PIO_CSKIP|UDI_PIO_R5, UDI_PIO_2BYTE, UDI_PIO_NZ}, {UDI_PIO_BRANCH, 0, 1}, // 1: End if ==0 {UDI_PIO_CSKIP|UDI_PIO_R5, UDI_PIO_2BYTE, UDI_PIO_NNEG}, {UDI_PIO_BRANCH, 0, 1}, // 1: End if <0 // - Read pages until all of packet RXd - {UDI_PIO_ADD|UDI_PIO_DIRECT|UDI_PIO_R7, UDI_PIO_1BYTE, 1}, + {UDI_PIO_ADD_IMM|UDI_PIO_DIRECT|UDI_PIO_R7, UDI_PIO_1BYTE, 1}, {UDI_PIO_STORE|UDI_PIO_DIRECT|UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_R7}, - {UDI_PIO_SUB|UDI_PIO_R0, UDI_PIO_1BYTE, NE2K_RX_LAST_PG+1}, + {UDI_PIO_ADD_IMM|UDI_PIO_R0, UDI_PIO_1BYTE, -(NE2K_RX_LAST_PG+1)}, {UDI_PIO_CSKIP|UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_NZ}, // if R7-RX_LAST == 0 {UDI_PIO_LOAD_IMM|UDI_PIO_R7, UDI_PIO_2BYTE, NE2K_RX_FIRST_PG}, // R7 = RX_FIRST // > Transaction start - PIO_MOV_RI1(R0, 1), - PIO_MOV_RI1(R1, 0), - PIO_OUT_RI1(R7, NE2K_REG_RSAR0), // Current RX page - PIO_OUT_RI1(R1, NE2K_REG_RSAR1), + PIO_MOV_RI1(R0, 0), + PIO_MOV_RI1(R1, 1), + PIO_OUT_RI1(R0, NE2K_REG_RSAR0), + PIO_OUT_RI1(R7, NE2K_REG_RSAR1), // Current RX page PIO_OUT_RI1(R0, NE2K_REG_RBCR0), PIO_OUT_RI1(R1, NE2K_REG_RBCR1), PIO_MOV_RI1(R0, 0x0A), PIO_OUT_RI1(R0, NE2K_REG_CMD), {UDI_PIO_DELAY, 0, 0}, // > Data to buffer (128 words) - // buffer offset maintained in R4 + // buffer offset maintained in R3 PIO_MOV_RI1(R1, NE2K_REG_MEM), // - Reg offset (no increment) PIO_MOV_RI1(R2, 256/2), // - Six iterations {UDI_PIO_REP_IN_IND, UDI_PIO_2BYTE, - UDI_PIO_REP_ARGS(UDI_PIO_BUF, UDI_PIO_R4, 2, UDI_PIO_R1, 0, UDI_PIO_R2)}, + UDI_PIO_REP_ARGS(UDI_PIO_BUF, UDI_PIO_R3, 1, UDI_PIO_R1, 0, UDI_PIO_R2)}, + {UDI_PIO_ADD_IMM|UDI_PIO_R3, UDI_PIO_2BYTE, 256}, // - Jump to length check - {UDI_PIO_SUB|UDI_PIO_R5, UDI_PIO_2BYTE, 256}, + {UDI_PIO_ADD_IMM|UDI_PIO_R5, UDI_PIO_2BYTE, -256}, {UDI_PIO_BRANCH, 0, 2}, // 2: Check against length // Cleanup @@ -166,7 +169,7 @@ udi_pio_trans_t ne2k_pio_rx[] = { PIO_MOV_RI1(R0, 0), {UDI_PIO_STORE|UDI_PIO_MEM|UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_R7}, // Store to mem[0] - {UDI_PIO_END, UDI_PIO_1BYTE, UDI_PIO_R6} // Status + {UDI_PIO_END, UDI_PIO_2BYTE, UDI_PIO_R4} // Length }; // // diff --git a/UDI/drivers/net_ne2000/ne2000_rx.c b/UDI/drivers/net_ne2000/ne2000_rx.c index 9b83f3a5..dda35770 100644 --- a/UDI/drivers/net_ne2000/ne2000_rx.c +++ b/UDI/drivers/net_ne2000/ne2000_rx.c @@ -10,6 +10,7 @@ #include "ne2000_common.h" // === PROTOTYPES === +udi_buf_write_call_t ne2k_rx__buf_allocated; udi_pio_trans_call_t ne2k_rx__complete; // === CODE === @@ -22,7 +23,7 @@ void ne2k_nd_rx_rx_rdy(udi_nic_rx_cb_t *cb) ne2k_rdata_t *rdata = gcb->context; // Add cb(s) to avaliable list - if( rdata->rx_last_cb ) { + if( rdata->rx_next_cb ) { rdata->rx_last_cb->chain = cb; } else { @@ -30,8 +31,9 @@ void ne2k_nd_rx_rx_rdy(udi_nic_rx_cb_t *cb) } rdata->rx_last_cb = cb; // Follow new chain - while( rdata->rx_last_cb->chain ) + while( rdata->rx_last_cb->chain ) { rdata->rx_last_cb = rdata->rx_last_cb->chain; + } } void ne2k_intr__rx_ok(udi_cb_t *gcb) @@ -42,8 +44,8 @@ void ne2k_intr__rx_ok(udi_cb_t *gcb) udi_nic_rx_cb_t *rx_cb = rdata->rx_next_cb; rdata->rx_next_cb = rx_cb->chain; rx_cb->chain = NULL; - udi_pio_trans(ne2k_rx__complete, UDI_GCB(rx_cb), - rdata->pio_handles[NE2K_PIO_RX], 0, NULL, &rdata->rx_next_page); + udi_debug_printf("ne2k_intr__rx_ok: Initialising buffer\n"); + udi_buf_write(ne2k_rx__buf_allocated, UDI_GCB(rx_cb), NULL, 1520, rx_cb->rx_buf, 0, 0, NULL); } else { @@ -53,9 +55,20 @@ void ne2k_intr__rx_ok(udi_cb_t *gcb) } } +void ne2k_rx__buf_allocated(udi_cb_t *gcb, udi_buf_t *new_buf) +{ + ne2k_rdata_t *rdata = gcb->context; + udi_nic_rx_cb_t *rx_cb = UDI_MCB(gcb, udi_nic_rx_cb_t); + + udi_debug_printf("ne2k_rx__buf_allocated: Buffer ready, cb=%p\n", rx_cb); + udi_pio_trans(ne2k_rx__complete, gcb, + rdata->pio_handles[NE2K_PIO_RX], 0, rx_cb->rx_buf, &rdata->rx_next_page); +} + void ne2k_rx__complete(udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit16_t result) { udi_nic_rx_cb_t *rx_cb = UDI_MCB(gcb, udi_nic_rx_cb_t); + rx_cb->rx_buf->buf_size = result; // TODO: Check result udi_nsr_rx_ind( rx_cb ); } -- 2.20.1