diff options
-rw-r--r-- | libs/Network/include/Network.h | 35 | ||||
-rw-r--r-- | libs/Network/rx.c | 37 | ||||
-rw-r--r-- | libs/Network/tx.c | 33 |
3 files changed, 46 insertions, 59 deletions
diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index 70c1140..25dab4b 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -47,20 +47,21 @@ #include <APE_APE.h> #include <APE_APE_PERI.h> -#include <APE_TX_PORT0.h> #include <APE_RX_PORT0.h> -#include <APE_TX_PORT1.h> #include <APE_RX_PORT1.h> -#include <APE_TX_PORT2.h> #include <APE_RX_PORT2.h> -#include <APE_TX_PORT3.h> #include <APE_RX_PORT3.h> +#include <APE_TX_PORT0.h> +#include <APE_TX_PORT1.h> +#include <APE_TX_PORT2.h> +#include <APE_TX_PORT3.h> #include <types.h> -typedef struct { +typedef struct +{ /* TX Registers */ volatile RegAPETxToNetPoolModeStatus_t *tx_mode; - volatile TX_PORT_t * tx_port; + volatile TX_PORT_t *tx_port; volatile RegAPETxToNetBufferAllocator_t *tx_allocator; volatile RegAPETxToNetDoorbell_t *tx_doorbell; @@ -71,6 +72,17 @@ typedef struct { volatile RegAPERxPoolRetire_t *rx_retire; } NetworkPort_t; +typedef union { + uint32_t r32; + struct + { + uint32_t payload_length:7; + uint32_t next_block:23; + uint32_t first:1; + uint32_t not_last:1; + } bits; +} network_control_t; + extern NetworkPort_t gPort0; extern NetworkPort_t gPort1; @@ -82,15 +94,18 @@ void Network_InitTxRx(void); uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size); int32_t Network_TX_allocateBlock(NetworkPort_t *port); -void Network_TX_transmitBePacket(uint8_t *packet, uint32_t length, NetworkPort_t *port); -void Network_TX_transmitLePacket(uint8_t *packet, uint32_t length, NetworkPort_t *port); +void Network_TX_transmitBePacket(uint8_t *packet, uint32_t length, + NetworkPort_t *port); +void Network_TX_transmitLePacket(uint8_t *packet, uint32_t length, + NetworkPort_t *port); -void Network_TX_transmitPassthroughPacket(uint32_t length, NetworkPort_t* port); +void Network_TX_transmitPassthroughPacket(uint32_t length, NetworkPort_t *port); // void Network_TX_transmitPassthroughPacket(RegAPE_PERIBmcToNcRxStatus_t // rx_status); -bool Network_RxLePatcket(uint32_t *buffer, uint32_t *length, NetworkPort_t *port); +bool Network_RxLePatcket(uint32_t *buffer, uint32_t *length, + NetworkPort_t *port); bool Network_PassthroughRxPatcket(NetworkPort_t *port); void Network_SetMACAddr(uint16_t high, uint32_t low, uint32_t index, diff --git a/libs/Network/rx.c b/libs/Network/rx.c index 069eaef..ef9f698 100644 --- a/libs/Network/rx.c +++ b/libs/Network/rx.c @@ -56,20 +56,11 @@ bool Network_RxLePatcket(uint32_t *buffer, uint32_t *bytes, NetworkPort_t *port) { RegAPERxbufoffset_t rxbuf; - rxbuf = *((RegAPERxbufoffset_t*)port->rx_offset); + rxbuf = *((RegAPERxbufoffset_t *)port->rx_offset); if ((int)rxbuf.bits.Valid) { uint32_t rx_bytes = 0; - union { - uint32_t r32; - struct - { - uint32_t payload_length:7; - uint32_t next_block:23; - uint32_t first:1; - uint32_t not_last:1; - } bits; - } control; + network_control_t control; int count = rxbuf.bits.Count; // int tailid = rxbuf.bits.Tail; int blockid = rxbuf.bits.Head; @@ -119,10 +110,10 @@ bool Network_RxLePatcket(uint32_t *buffer, uint32_t *bytes, NetworkPort_t *port) retire.bits.Tail = rxbuf.bits.Tail; retire.bits.Count = rxbuf.bits.Count; retire.bits.Retire = 1; - *((RegAPERxPoolRetire_t*)port->rx_retire) = retire; + *((RegAPERxPoolRetire_t *)port->rx_retire) = retire; rxbuf.bits.Finished = 1; - *((RegAPERxbufoffset_t*)port->rx_offset) = rxbuf; + *((RegAPERxbufoffset_t *)port->rx_offset) = rxbuf; *bytes = rx_bytes; @@ -137,22 +128,13 @@ bool Network_RxLePatcket(uint32_t *buffer, uint32_t *bytes, NetworkPort_t *port) bool Network_PassthroughRxPatcket(NetworkPort_t *port) { RegAPERxbufoffset_t rxbuf; - rxbuf = *((RegAPERxbufoffset_t*)port->rx_offset); + rxbuf = *((RegAPERxbufoffset_t *)port->rx_offset); if ((int)rxbuf.bits.Valid) { #if CXX_SIMULATOR rxbuf.print(); #endif - union { - uint32_t r32; - struct - { - uint32_t payload_length:7; - uint32_t next_block:23; - uint32_t first:1; - uint32_t not_last:1; - } bits; - } control; + network_control_t control; int count = rxbuf.bits.Count; // int tailid = rxbuf.bits.Tail; int blockid = rxbuf.bits.Head; @@ -208,7 +190,8 @@ bool Network_PassthroughRxPatcket(NetworkPort_t *port) { // data = block[i + offset].r32; // Last word to send. - APE_PERI.BmcToNcTxControl.r32 = control.bits.payload_length % sizeof(uint32_t); + APE_PERI.BmcToNcTxControl.r32 = + control.bits.payload_length % sizeof(uint32_t); APE_PERI.BmcToNcTxBufferLast.r32 = data; // Ignore last word - drop the FCS. @@ -222,14 +205,14 @@ bool Network_PassthroughRxPatcket(NetworkPort_t *port) retire.bits.Head = blockid; retire.bits.Tail = blockid; retire.bits.Count = 1; - *((RegAPERxPoolRetire_t*)port->rx_retire) = retire; + *((RegAPERxPoolRetire_t *)port->rx_retire) = retire; blockid = control.bits.next_block; } // Mark the frame as read. rxbuf.bits.Finished = 1; - *((RegAPERxbufoffset_t*)port->rx_offset) = rxbuf; + *((RegAPERxbufoffset_t *)port->rx_offset) = rxbuf; return true; } diff --git a/libs/Network/tx.c b/libs/Network/tx.c index 0663b0d..f539773 100644 --- a/libs/Network/tx.c +++ b/libs/Network/tx.c @@ -67,17 +67,6 @@ static inline uint32_t be32toh(uint32_t be32) #define FIRST_FRAME_MAX ((TX_PORT_OUT_ALL_BLOCK_WORDS - TX_PORT_OUT_ALL_FIRST_PAYLOAD_WORD) * sizeof(uint32_t)) #define ADDITIONAL_FRAME_MAX ((TX_PORT_OUT_ALL_BLOCK_WORDS - TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD) * sizeof(uint32_t)) -typedef union { - uint32_t r32; - struct - { - uint32_t payload_length:7; - uint32_t next_block:23; - uint32_t first:1; - uint32_t not_last:1; - } bits; -} control_t; - uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size) { uint32_t blocks = 1; @@ -96,7 +85,7 @@ uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size) return blocks; } -int32_t __attribute__((noinline)) Network_TX_allocateBlock(NetworkPort_t* port) +int32_t __attribute__((noinline)) Network_TX_allocateBlock(NetworkPort_t *port) { int32_t block; @@ -104,13 +93,13 @@ int32_t __attribute__((noinline)) Network_TX_allocateBlock(NetworkPort_t* port) RegAPETxToNetBufferAllocator_t alloc; alloc.r32 = 0; alloc.bits.RequestAllocation = 1; - *((RegAPETxToNetBufferAllocator_t*)port->tx_allocator) = alloc; + *((RegAPETxToNetBufferAllocator_t *)port->tx_allocator) = alloc; // Wait for state machine to finish RegAPETxToNetBufferAllocator_t status; do { - status = *((RegAPETxToNetBufferAllocator_t*)port->tx_allocator); + status = *((RegAPETxToNetBufferAllocator_t *)port->tx_allocator); } while (APE_TX_TO_NET_BUFFER_ALLOCATOR_STATE_PROCESSING == status.bits.State); if (APE_TX_TO_NET_BUFFER_ALLOCATOR_STATE_ALLOCATION_OK != status.bits.State) @@ -138,7 +127,7 @@ static uint32_t inline Network_TX_initFirstBlock(RegTX_PORTOut_t *block, uint32_t *packet, bool big_endian) { - control_t control; + network_control_t control; int copy_length; int i; @@ -220,7 +209,7 @@ static uint32_t inline Network_TX_initAdditionalBlock(RegTX_PORTOut_t *block, bool big_endian) { int i; - control_t control; + network_control_t control; control.r32 = 0; control.bits.first = 0; @@ -323,15 +312,15 @@ static inline void Network_TX_transmitPacket_internal(uint8_t *packet, doorbell.bits.Tail = tail; doorbell.bits.Length = total_blocks; - *((RegAPETxToNetDoorbell_t*)port->tx_doorbell) = doorbell; + *((RegAPETxToNetDoorbell_t *)port->tx_doorbell) = doorbell; } -void Network_TX_transmitBePacket(uint8_t *packet, uint32_t length, NetworkPort_t* port) +void Network_TX_transmitBePacket(uint8_t *packet, uint32_t length, NetworkPort_t *port) { Network_TX_transmitPacket_internal(packet, length, true, port); } -void Network_TX_transmitLePacket(uint8_t *packet, uint32_t length, NetworkPort_t* port) +void Network_TX_transmitLePacket(uint8_t *packet, uint32_t length, NetworkPort_t *port) { Network_TX_transmitPacket_internal(packet, length, false, port); } @@ -339,7 +328,7 @@ void Network_TX_transmitLePacket(uint8_t *packet, uint32_t length, NetworkPort_t static uint32_t inline Network_TX_initFirstPassthroughBlock( RegTX_PORTOut_t *block, uint32_t length, int32_t blocks, int32_t next_block) { - control_t control; + network_control_t control; int copy_length; int i; @@ -405,7 +394,7 @@ static uint32_t inline Network_TX_initAdditionalPassthroughBlock( RegTX_PORTOut_t *block, int32_t next_block, uint32_t length) { int i; - control_t control; + network_control_t control; control.r32 = 0; control.bits.first = 0; @@ -489,7 +478,7 @@ void Network_TX_transmitPassthroughPacket(uint32_t length, NetworkPort_t *port) doorbell.bits.Tail = tail; doorbell.bits.Length = total_blocks; - *((RegAPETxToNetDoorbell_t*)port->tx_doorbell) = doorbell; + *((RegAPETxToNetDoorbell_t *)port->tx_doorbell) = doorbell; // Read last RX word (FCS) to clear the buffer uint32_t data = APE_PERI.BmcToNcReadBuffer.r32; |