diff options
author | Evan Lojewski <github@meklort.com> | 2019-05-04 10:34:10 -0600 |
---|---|---|
committer | Evan Lojewski <github@meklort.com> | 2019-05-04 10:34:10 -0600 |
commit | 418c47d20e0fe1b9074490f3e16109f80355cf3b (patch) | |
tree | 89f5a6e88dc3f2b9ed2e416231e6eb1ec52b3da6 /libs | |
parent | f3bcf9a4af7ada743fae84c3572d9e4cc1d44ae5 (diff) | |
download | bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.tar.gz bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.zip |
Begin cleaning up tx/rx code
Diffstat (limited to 'libs')
-rw-r--r-- | libs/NCSI/CMakeLists.txt | 3 | ||||
-rw-r--r-- | libs/NCSI/include/Ethernet.h | 21 | ||||
-rw-r--r-- | libs/NCSI/ncsi.c | 95 | ||||
-rw-r--r-- | libs/Network/CMakeLists.txt | 7 | ||||
-rw-r--r-- | libs/Network/generic.c | 73 | ||||
-rw-r--r-- | libs/Network/include/Network.h | 6 | ||||
-rw-r--r-- | libs/Network/init.c | 6 | ||||
-rw-r--r-- | libs/Network/tx.c | 19 |
8 files changed, 171 insertions, 59 deletions
diff --git a/libs/NCSI/CMakeLists.txt b/libs/NCSI/CMakeLists.txt index 67e9a1e..90fa313 100644 --- a/libs/NCSI/CMakeLists.txt +++ b/libs/NCSI/CMakeLists.txt @@ -47,12 +47,13 @@ project(NCSI) # Host Simulation library simulator_add_library(${PROJECT_NAME} STATIC ncsi.c) -target_link_libraries(${PROJECT_NAME} PRIVATE simulator) +target_link_libraries(${PROJECT_NAME} PRIVATE simulator Network) target_include_directories(${PROJECT_NAME} PUBLIC ../../include) target_include_directories(${PROJECT_NAME} PUBLIC include) # ARM Library arm_add_library(${PROJECT_NAME}-arm STATIC ncsi.c) +target_link_libraries(${PROJECT_NAME}-arm PRIVATE Network-arm) target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include) target_include_directories(${PROJECT_NAME}-arm PUBLIC include) diff --git a/libs/NCSI/include/Ethernet.h b/libs/NCSI/include/Ethernet.h index 358dcbf..632499b 100644 --- a/libs/NCSI/include/Ethernet.h +++ b/libs/NCSI/include/Ethernet.h @@ -190,6 +190,25 @@ typedef struct { uint32_t OEMLinkSettings_Low:16; } SetLink_t; +typedef struct { + // Bytes 0 - 27 + ControlPacketHeader_t header; + + // Byte 28 - 31 + uint32_t MAC54:16; + uint32_t headerPadding:16; + + // Bytes 32 - 35 + uint32_t MAC10:16; + uint32_t MAC32:16; + + // Bytes 36 - 39 + uint32_t pad:16; + uint32_t Enable:1; + uint32_t Rsvd:4; + uint32_t AT:3; + uint32_t MACNumber:8; +} SetMACAddr_t; typedef struct @@ -297,6 +316,8 @@ typedef union { SetLink_t setLink; + SetMACAddr_t setMACAddr; + /* Response Packets */ ResponsePacketHeader_t responsePacket; diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c index b27a7e2..d490c94 100644 --- a/libs/NCSI/ncsi.c +++ b/libs/NCSI/ncsi.c @@ -51,6 +51,9 @@ #include <APE_SHM_CHANNEL3.h> #include <stdbool.h> +#include <Network.h> +#include <types.h> + #define MAX_CHANNELS 4 #define PACKAGE_ID_SHIFT 5 @@ -78,7 +81,7 @@ NetworkFrame_t gResponseFrame = { .responsePacket = { .DestinationAddress = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - .SourceAddress = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, + .SourceAddress = {0xFF, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF}, .HeaderRevision = 1, .ManagmentControllerID = 0, @@ -115,10 +118,10 @@ NetworkFrame_t gLinkStatusResponseFrame = .PayloadLength = 16, .reserved_1 = 0, - .ResponseCode = 0, + .ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE, .reserved_4 = 0, .LinkStatus_High = 0, - .ReasonCode = 0, + .ReasonCode = NCSI_REASON_CODE_NONE, .OtherIndications_High = 0, .LinkStatus_Low = 0, .OEMLinkStatus_High = 0, @@ -424,9 +427,19 @@ static void setMACAddressHandler(NetworkFrame_t* frame) #if CXX_SIMULATOR int ch = frame->controlPacket.ChannelID & CHANNEL_ID_MASK; printf("Set MAC: channel %x\n", ch); + printf("MAC54: 0x%04X\n", frame->setMACAddr.MAC54); + printf("MAC32: 0x%04X\n", frame->setMACAddr.MAC32); + printf("MAC10: 0x%04X\n", frame->setMACAddr.MAC10); + printf("Enable: 0x%04X\n", frame->setMACAddr.Enable); + printf("AT: 0x%04X\n", frame->setMACAddr.AT); + printf("MACNumber: 0x%04X\n", frame->setMACAddr.MACNumber); #endif // gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Enabled = false; + uint32_t low = (frame->setMACAddr.MAC32 << 16) | frame->setMACAddr.MAC10; + Network_SetMACAddr(frame->setMACAddr.MAC54, low, frame->setMACAddr.MACNumber, frame->setMACAddr.Enable); + + sendNCSIResponse( frame->controlPacket.InstanceID, frame->controlPacket.ChannelID, @@ -593,27 +606,13 @@ void resetChannel(int ch) channel->shm->NcsiChannelCtrlstatRx.r32 = 0; } -void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t LinkStatus, uint32_t OEMLinkStatus, uint32_t OtherIndications) +void NCSI_TxPacket(uint32_t* packet, uint32_t packet_len) { - uint32_t packetSize = ETHERNET_FRAME_MIN - 4; - uint32_t packetWords = ((packetSize + 3) / 4); - uint32_t lastBytes = packetSize % 4; + uint32_t packetWords = DIVIDE_RND_UP(packet_len, sizeof(uint32_t)); RegAPE_PERIBmcToNcTxControl_t txControl; txControl.r32 = 0; - txControl.bits.LastByteCount = lastBytes; - - gLinkStatusResponseFrame.linkStatusResponse.ChannelID = channelID; - gLinkStatusResponseFrame.linkStatusResponse.InstanceID = InstanceID; - gLinkStatusResponseFrame.linkStatusResponse.ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE; - gLinkStatusResponseFrame.linkStatusResponse.ReasonCode = NCSI_REASON_CODE_NONE; - - gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_High = LinkStatus >> 16; - gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_Low = LinkStatus & 0xffff; - gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_High = OEMLinkStatus >> 16; - gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_Low = OEMLinkStatus & 0xffff; - gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_High = OtherIndications >> 16; - gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_Low = OtherIndications & 0xffff; + txControl.bits.LastByteCount = packet_len % sizeof(uint32_t); // Wait for enough free space. while(APE_PERI.BmcToNcTxStatus.bits.InFifo < packetWords); @@ -622,57 +621,51 @@ void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t for(int i = 0; i < packetWords-1; i++) { #if CXX_SIMULATOR - printf("Transmitting word %d: 0x%08x\n", i, gLinkStatusResponseFrame.words[i]); + printf("Transmitting word %d: 0x%08x\n", i, packet[i]); #endif - APE_PERI.BmcToNcTxBuffer.r32 = gLinkStatusResponseFrame.words[i]; + APE_PERI.BmcToNcTxBuffer.r32 = packet[i]; } APE_PERI.BmcToNcTxControl = txControl; #if CXX_SIMULATOR - printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, gLinkStatusResponseFrame.words[packetWords - 1]); + printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, packet[packetWords - 1]); #endif + APE_PERI.BmcToNcTxBufferLast.r32 = packet[packetWords - 1]; +} +void sendNCSILinkStatusResponse(uint8_t InstanceID, uint8_t channelID, uint32_t LinkStatus, uint32_t OEMLinkStatus, uint32_t OtherIndications) +{ + uint32_t packetSize = ETHERNET_FRAME_MIN - 4; + + gLinkStatusResponseFrame.linkStatusResponse.ChannelID = channelID; + gLinkStatusResponseFrame.linkStatusResponse.InstanceID = InstanceID; + gLinkStatusResponseFrame.linkStatusResponse.ResponseCode = NCSI_RESPONSE_CODE_COMMAND_COMPLETE; + gLinkStatusResponseFrame.linkStatusResponse.ReasonCode = NCSI_REASON_CODE_NONE; + + gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_High = LinkStatus >> 16; + gLinkStatusResponseFrame.linkStatusResponse.LinkStatus_Low = LinkStatus & 0xffff; + gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_High = OEMLinkStatus >> 16; + gLinkStatusResponseFrame.linkStatusResponse.OEMLinkStatus_Low = OEMLinkStatus & 0xffff; + gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_High = OtherIndications >> 16; + gLinkStatusResponseFrame.linkStatusResponse.OtherIndications_Low = OtherIndications & 0xffff; + - APE_PERI.BmcToNcTxBufferLast.r32 = gLinkStatusResponseFrame.words[packetWords - 1]; + NCSI_TxPacket(gLinkStatusResponseFrame.words, packetSize); } void sendNCSIResponse(uint8_t InstanceID, uint8_t channelID, uint16_t controlID, uint16_t response_code, uint16_t reasons_code) { uint32_t packetSize = ETHERNET_FRAME_MIN - 4; - uint32_t packetWords = ((packetSize + 3) / 4); - uint32_t lastBytes = packetSize % 4; - - RegAPE_PERIBmcToNcTxControl_t txControl; - txControl.r32 = 0; - txControl.bits.LastByteCount = lastBytes; gResponseFrame.responsePacket.ChannelID = channelID; gResponseFrame.responsePacket.ControlPacketType = controlID | CONTROL_PACKET_TYPE_RESPONSE; gResponseFrame.responsePacket.InstanceID = InstanceID; - // Payload data - 4 bytes + gResponseFrame.responsePacket.ResponseCode = response_code; gResponseFrame.responsePacket.ReasonCode = reasons_code; - // NetworkFrame_t frame; - // frame. - - // Wait for enough free space. - while(APE_PERI.BmcToNcTxStatus.bits.InFifo < packetWords); - - // Transmit. - for(int i = 0; i < packetWords-1; i++) - { -#if CXX_SIMULATOR - printf("Transmitting word %d: 0x%08x\n", i, gResponseFrame.words[i]); -#endif - APE_PERI.BmcToNcTxBuffer.r32 = gResponseFrame.words[i]; - } - APE_PERI.BmcToNcTxControl = txControl; + NCSI_TxPacket(gResponseFrame.words, packetSize); +} -#if CXX_SIMULATOR - printf("Transmitting last word %d: 0x%08x\n", packetWords - 1, gResponseFrame.words[packetWords - 1]); -#endif - APE_PERI.BmcToNcTxBufferLast.r32 = gResponseFrame.words[packetWords - 1]; -} diff --git a/libs/Network/CMakeLists.txt b/libs/Network/CMakeLists.txt index e5dd1a5..3618c71 100644 --- a/libs/Network/CMakeLists.txt +++ b/libs/Network/CMakeLists.txt @@ -46,15 +46,18 @@ project(Network) # Host Simulation library -simulator_add_library(${PROJECT_NAME} STATIC tx.c) +simulator_add_library(${PROJECT_NAME} STATIC tx.c generic.c) target_link_libraries(${PROJECT_NAME} PRIVATE simulator NCSI) target_include_directories(${PROJECT_NAME} PUBLIC ../../include) target_include_directories(${PROJECT_NAME} PUBLIC include) # ARM Library -arm_add_library(${PROJECT_NAME}-arm STATIC init.c tx.c) +arm_add_library(${PROJECT_NAME}-arm STATIC init.c tx.c generic.c) target_link_libraries(${PROJECT_NAME}-arm PRIVATE NCSI-arm) target_include_directories(${PROJECT_NAME}-arm PUBLIC ../../include) target_include_directories(${PROJECT_NAME}-arm PUBLIC include) + # SET_SOURCE_FILES_PROPERTIES( tx.c PROPERTIES COMPILE_FLAGS -O3 ) + + # add_subdirectory(tests)
\ No newline at end of file diff --git a/libs/Network/generic.c b/libs/Network/generic.c new file mode 100644 index 0000000..ef25804 --- /dev/null +++ b/libs/Network/generic.c @@ -0,0 +1,73 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file init.c +/// +/// @project +/// +/// @brief Initialization code for TX to network / RX from network. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2018, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the copyright holder nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +#include <Network.h> + +#include <APE_DEVICE.h> + +void Network_SetMACAddr(uint16_t high, uint32_t low, uint32_t index, bool enabled) +{ + uint32_t match_high = (high << 16) | (low >> 16); + uint16_t match_low = (low << 16); + APE_PERI.BmcToNcSourceMacMatch0High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch0Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch1High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch1Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch2High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch2Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch3High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch3Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch4High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch4Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch5High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch5Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch6High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch6Low.r32 = match_low; + APE_PERI.BmcToNcSourceMacMatch7High.r32 = match_high; + APE_PERI.BmcToNcSourceMacMatch7Low.r32 = match_low; + + DEVICE.PerfectMatch1High.r32 = high; + DEVICE.PerfectMatch1Low.r32 = low; + +}
\ No newline at end of file diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h index 8bfadcf..d96d665 100644 --- a/libs/Network/include/Network.h +++ b/libs/Network/include/Network.h @@ -46,6 +46,8 @@ #define NETWORK_H #include <stdint.h> +#include <stdbool.h> +#include <APE_APE_PERI.h> void Network_InitTxRx(void); @@ -53,7 +55,11 @@ uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size); int32_t Network_TX_allocateBlock(void); void Network_TX_transmitBePacket(uint8_t* packet, uint32_t length); +void Network_TX_transmitLePacket(uint8_t* packet, uint32_t length); +// void Network_TX_transmitPassthroughPacket(RegAPE_PERIBmcToNcRxStatus_t rx_status); + +void Network_SetMACAddr(uint16_t high, uint32_t low, uint32_t index, bool enabled); diff --git a/libs/Network/init.c b/libs/Network/init.c index 45be102..f9d1925 100644 --- a/libs/Network/init.c +++ b/libs/Network/init.c @@ -46,6 +46,8 @@ #include <APE_APE.h> #include <APE_DEVICE.h> +#include <Network.h> + typedef struct { RegFILTERSElementConfig_t cfg; RegFILTERSElementPattern_t pat; @@ -672,8 +674,8 @@ void Network_InitTxRx(void) // I recommend also setting APE_PROMISCUOUS_MODE and PROMISCUOUS_MODE, // as these will cause you less headaches during development. DEVICE.ReceiveMacMode.bits.Enable = 1; - DEVICE.ReceiveMacMode.bits.PromiscuousMode = 1; - DEVICE.ReceiveMacMode.bits.APEPromiscuousMode = 1; + DEVICE.ReceiveMacMode.bits.PromiscuousMode = 0; + DEVICE.ReceiveMacMode.bits.APEPromiscuousMode = 0; // Ensure REG_EMAC_MODE__ENABLE_APE_{TX,RX}_PATH are set. // *** NOTE: Both bits are set in rmu.c ***/ diff --git a/libs/Network/tx.c b/libs/Network/tx.c index 0f4fb5d..ae78348 100644 --- a/libs/Network/tx.c +++ b/libs/Network/tx.c @@ -92,7 +92,7 @@ uint32_t Network_TX_numBlocksNeeded(uint32_t frame_size) } #ifdef CXX_SIMULATOR - printf("%d blocks needed for packet\n", blocks); + printf("%d blocks needed for packet with frame size %d\n", blocks, frame_size); #endif return blocks; } @@ -173,10 +173,16 @@ static uint32_t inline Network_TX_initFirstBlock(RegTX_PORTOut_t* block, uint32_ { if(big_endian) { +#if CXX_SIMULATOR + printf("1st[%d] = 0x%08X\n", i, be32toh(packet[i])); +#endif block[TX_PORT_OUT_ALL_FIRST_PAYLOAD_WORD + i].r32 = be32toh(packet[i]); } else { +#if CXX_SIMULATOR + printf("1LE[%d] = 0x%08X\n", i, (packet[i])); +#endif block[TX_PORT_OUT_ALL_FIRST_PAYLOAD_WORD + i].r32 = (packet[i]); } } @@ -241,7 +247,14 @@ static uint32_t inline Network_TX_initAdditionalBlock(RegTX_PORTOut_t* block, in int num_words = (length + sizeof(uint32_t) - 1)/sizeof(uint32_t); for(i = 0; i < num_words; i++) { - block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = be32toh(packet[i]); + if(big_endian) + { + block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = be32toh(packet[i]); + } + else + { + block[TX_PORT_OUT_ALL_ADDITIONAL_PAYLOAD_WORD + i].r32 = (packet[i]); + } } @@ -340,5 +353,5 @@ void Network_TX_transmitBePacket(uint8_t* packet, uint32_t length) void Network_TX_transmitLePacket(uint8_t* packet, uint32_t length) { - Network_TX_transmitPacket(packet, length, true); + Network_TX_transmitPacket(packet, length, false); }
\ No newline at end of file |