diff options
Diffstat (limited to 'libs/NCSI/ncsi.c')
-rw-r--r-- | libs/NCSI/ncsi.c | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c index b27a7e2..e2c3b68 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,59 @@ 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; - APE_PERI.BmcToNcTxBufferLast.r32 = gLinkStatusResponseFrame.words[packetWords - 1]; + 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; + + + 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); + NCSI_TxPacket(gResponseFrame.words, packetSize); +} - // Transmit. - for(int i = 0; i < packetWords-1; i++) +void NCSI_init(void) +{ + for(int i = 0; i < ARRAY_ELEMENTS(gPackageState.channel); i++) { -#if CXX_SIMULATOR - printf("Transmitting word %d: 0x%08x\n", i, gResponseFrame.words[i]); -#endif - APE_PERI.BmcToNcTxBuffer.r32 = gResponseFrame.words[i]; + gPackageState.channel[i].shm->NcsiChannelInfo.bits.Ready = false; } +} - APE_PERI.BmcToNcTxControl = txControl; - -#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]; -} |