diff options
Diffstat (limited to 'fw/fe310')
-rw-r--r-- | fw/fe310/eos/dev/net.c | 80 |
1 files changed, 36 insertions, 44 deletions
diff --git a/fw/fe310/eos/dev/net.c b/fw/fe310/eos/dev/net.c index d287e5a..6114485 100644 --- a/fw/fe310/eos/dev/net.c +++ b/fw/fe310/eos/dev/net.c @@ -146,10 +146,10 @@ static int net_xchg_next(unsigned char *_buffer) { } static void net_handle_xchg(void) { - volatile uint32_t r1, r2, r3; - uint32_t len; - if (net_state_flags & NET_STATE_FLAG_INIT) { + volatile uint32_t r1, r2, r3; + uint32_t len; + net_state_flags &= ~NET_STATE_FLAG_INIT; r1 = SPI1_REG(SPI_REG_RXFIFO); @@ -167,13 +167,6 @@ static void net_handle_xchg(void) { net_state_len_rx |= (r3 & 0xFF); len = MAX(net_state_len_tx, net_state_len_rx); - if (len > EOS_NET_MTU) { - net_state_flags &= ~NET_STATE_FLAG_XCHG; - SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; - SPI1_REG(SPI_REG_IE) = 0x0; - return; - } - // esp32 dma workaraund if (len < 8 - NET_SIZE_HDR) { len = 8 - NET_SIZE_HDR; @@ -181,6 +174,13 @@ static void net_handle_xchg(void) { len = ((len + NET_SIZE_HDR)/4 + 1) * 4 - NET_SIZE_HDR; } + if (len > EOS_NET_MTU) { + net_state_flags &= ~NET_STATE_FLAG_XCHG; + SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; + SPI1_REG(SPI_REG_IE) = 0x0; + return; + } + _eos_spi_xchg_init(net_state_buf, len, 0); SPI1_REG(SPI_REG_TXCTRL) = SPI_TXWM(SPI_SIZE_WM); SPI1_REG(SPI_REG_IE) = SPI_IP_TXWM; @@ -191,7 +191,7 @@ static void net_handle_xchg(void) { if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_AUTO) { // exchange done if (!(net_state_flags & NET_STATE_FLAG_SYNC)) { if (net_state_type) { - int r = eos_evtq_push_isr(EOS_EVT_NET | net_state_type, net_state_buf, net_state_len_rx); + int r = eos_evtq_push_isr(EOS_EVT_NET | (net_state_type & ~EOS_NET_MTYPE_FLAG_MASK), net_state_buf, net_state_len_rx); if (r) eos_bufq_push(&net_buf_q, net_state_buf); } else if (((net_state_flags & NET_STATE_FLAG_ONEW) || net_state_next_cnt) && (net_state_next_buf == NULL)) { net_state_next_buf = net_state_buf; @@ -292,8 +292,25 @@ static void evt_handler(unsigned char type, unsigned char *buffer, uint16_t len) } } +static void net_wait4xchg(void) { + while (net_state_flags & NET_STATE_FLAG_XCHG) { + asm volatile ("wfi"); + set_csr(mstatus, MSTATUS_MIE); + clear_csr(mstatus, MSTATUS_MIE); + } +} + +static void net_wait4cts(void) { + while (!(net_state_flags & NET_STATE_FLAG_CTS)) { + asm volatile ("wfi"); + set_csr(mstatus, MSTATUS_MIE); + clear_csr(mstatus, MSTATUS_MIE); + } +} + static void net_pause(void) { net_state_flags &= ~NET_STATE_FLAG_RUN; + net_wait4xchg(); } static void net_resume(void) { @@ -376,23 +393,10 @@ void eos_net_start(void) { } void eos_net_stop(void) { - uint8_t done = 0; - clear_csr(mstatus, MSTATUS_MIE); - if (net_state_flags & NET_STATE_FLAG_RUN) { - net_state_flags &= ~NET_STATE_FLAG_RUN; - done = !(net_state_flags & NET_STATE_FLAG_XCHG); - } else { - done = 1; - } + net_pause(); set_csr(mstatus, MSTATUS_MIE); - while (!done) { - clear_csr(mstatus, MSTATUS_MIE); - done = !(net_state_flags & NET_STATE_FLAG_XCHG); - if (!done) asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - } net_stop(); } @@ -477,7 +481,7 @@ void eos_net_release(void) { unsigned char *eos_net_alloc(void) { unsigned char *ret = NULL; - while (!ret) { + while (ret == NULL) { clear_csr(mstatus, MSTATUS_MIE); if (net_state_next_buf) { ret = net_state_next_buf; @@ -534,31 +538,19 @@ static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len, u if (_sync) { net_pause(); - while (!(net_state_flags & NET_STATE_FLAG_CTS)) { - asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - clear_csr(mstatus, MSTATUS_MIE); - } + net_wait4cts(); if (flags & EOS_NET_FLAG_SYNC) { net_state_flags |= NET_STATE_FLAG_SYNC; } net_xchg_start(_type, buffer, _len); if (flags & EOS_NET_FLAG_SYNC) { if (flags & EOS_NET_FLAG_REPL) { - while (!(net_state_flags & NET_STATE_FLAG_CTS)) { - asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - clear_csr(mstatus, MSTATUS_MIE); - } + net_wait4cts(); net_xchg_start(0, buffer, 0); } - while (net_state_flags & NET_STATE_FLAG_XCHG) { - asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - clear_csr(mstatus, MSTATUS_MIE); - } + net_wait4xchg(); net_state_flags &= ~NET_STATE_FLAG_SYNC; - *type = net_state_type; + *type = (net_state_type & ~EOS_NET_MTYPE_FLAG_MASK); *len = net_state_len_rx; } net_resume(); @@ -591,8 +583,8 @@ int eos_net_send_async(unsigned char type, unsigned char *buffer, uint16_t len, int _eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char async, unsigned char more) { if (async) { - eos_net_send_async(type, buffer, len, more); + return eos_net_send_async(type, buffer, len, more); } else { - eos_net_send(type, buffer, len); + return eos_net_send(type, buffer, len); } } |