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/NCSI | |
parent | f3bcf9a4af7ada743fae84c3572d9e4cc1d44ae5 (diff) | |
download | bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.tar.gz bcm5719-ortega-418c47d20e0fe1b9074490f3e16109f80355cf3b.zip |
Begin cleaning up tx/rx code
Diffstat (limited to 'libs/NCSI')
-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 |
3 files changed, 67 insertions, 52 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]; -} |