summaryrefslogtreecommitdiffstats
path: root/libs/NCSI
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2019-04-14 20:38:52 -0600
committerEvan Lojewski <github@meklort.com>2019-04-14 20:38:52 -0600
commit92b3044f5dd7e2fe270178654c3c0303a664777a (patch)
tree1d1ec6dc32e6140bf18635a4923d112c23b4145f /libs/NCSI
parent0cf10183e0f05c643b8c9112ef74efa2a8396eab (diff)
downloadbcm5719-ortega-92b3044f5dd7e2fe270178654c3c0303a664777a.tar.gz
bcm5719-ortega-92b3044f5dd7e2fe270178654c3c0303a664777a.zip
Add handling for the AEN Enable command.
Diffstat (limited to 'libs/NCSI')
-rw-r--r--libs/NCSI/include/Ethernet.h32
-rw-r--r--libs/NCSI/ncsi.c75
2 files changed, 67 insertions, 40 deletions
diff --git a/libs/NCSI/include/Ethernet.h b/libs/NCSI/include/Ethernet.h
index 9a2d4e7..0237c54 100644
--- a/libs/NCSI/include/Ethernet.h
+++ b/libs/NCSI/include/Ethernet.h
@@ -128,32 +128,50 @@ _Static_assert(sizeof(ControlPacketHeader_t) == 16 + PACKET_OFFSET, "sizeof(Cont
#define CONTROL_PACKET_OEM_COMMAND (0x50)
-typedef union {
+typedef struct {
// Bytes 0 - 27
ControlPacketHeader_t header;
// Byte 28 - 31
- uint32_t checksumHigh:16;
uint32_t headerPadding:16;
+ uint32_t checksumHigh:16;
// Bytes 32 - 35
- uint32_t pad:16;
uint32_t checksumLow;
+ uint32_t pad:16;
} ClearInitialState_t;
-typedef union {
+typedef struct {
// Bytes 0 - 27
ControlPacketHeader_t header;
// Byte 28 - 31
uint32_t HardwareArbitartionDisabled:8;
+ uint32_t reserved_0:8;
uint32_t headerPadding:16;
// Bytes 32 - 35
- uint32_t pad:16;
uint32_t checksumLow;
+ uint32_t pad:16;
} SelectPackage_t;
+typedef struct {
+ // Bytes 0 - 27
+ ControlPacketHeader_t header;
+
+ // Byte 28 - 31
+ uint32_t AEN_MC_ID:8;
+ uint32_t reserved_0:8;
+ uint32_t headerPadding:16;
+
+ // Bytes 32 - 35
+ uint32_t AENControl_High:16;
+ uint32_t reserved_1:16;
+
+ // Bytes 36 - 39
+ uint32_t pad:16;
+ uint32_t AENControl_Low:16;
+} AENEnable_t;
@@ -229,6 +247,10 @@ typedef union {
ClearInitialState_t clearInitialState;
+ SelectPackage_t selectPackage;
+
+ AENEnable_t AENEnable;
+
/* Response Packets */
ResponsePacketHeader_t responsePacket;
} NetworkFrame_t;
diff --git a/libs/NCSI/ncsi.c b/libs/NCSI/ncsi.c
index b19660c..7b58f3f 100644
--- a/libs/NCSI/ncsi.c
+++ b/libs/NCSI/ncsi.c
@@ -110,31 +110,23 @@ package_state_t gPackageState = {
.selected = false,
.channel = {
[0] = {
- .initialized = false,
.AENEnables = false,
.AsyncronousTrafficEn = false,
- .PassthroughTXTrafficEn = false,
.shm = &SHM_CHANNEL0,
},
[1] = {
- .initialized = false,
.AENEnables = false,
.AsyncronousTrafficEn = false,
- .PassthroughTXTrafficEn = false,
.shm = &SHM_CHANNEL1,
},
[2] = {
- .initialized = false,
.AENEnables = false,
.AsyncronousTrafficEn = false,
- .PassthroughTXTrafficEn = false,
.shm = &SHM_CHANNEL2,
},
[3] = {
- .initialized = false,
.AENEnables = false,
.AsyncronousTrafficEn = false,
- .PassthroughTXTrafficEn = false,
.shm = &SHM_CHANNEL3,
},
},
@@ -170,7 +162,7 @@ void unknownHandler(NetworkFrame_t* frame)
#endif
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_UNSUPPORTED,
@@ -182,33 +174,33 @@ static void clearInitialStateHandler(NetworkFrame_t* frame)
{
int ch = frame->controlPacket.ChannelID & CHANNEL_ID_MASK;
- gPackageState.channel[ch].initialized = true;
+ gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Ready = true;
#if CXX_SIMULATOR
printf("Clear initial state: channel %x\n", ch);
- printf(" Initialized: %d\n", gPackageState.channel[ch].initialized);
+ printf(" Initialized: %d\n", (uint32_t)gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Ready);
#endif
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
}
-static void selectPacakgeHandler(NetworkFrame_t* frame)
+static void selectPackageHandler(NetworkFrame_t* frame)
{
#if CXX_SIMULATOR
- printf("Package enabled.\n");
+ printf("Package enabled. HardwareArbitartionDisabled: %d\n", frame->selectPackage.HardwareArbitartionDisabled);
#endif
gPackageState.selected = true;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
}
-static void deselectPacakgeHandler(NetworkFrame_t* frame)
+static void deselectPackageHandler(NetworkFrame_t* frame)
{
#if CXX_SIMULATOR
printf("Package disabled.\n");
@@ -216,7 +208,7 @@ static void deselectPacakgeHandler(NetworkFrame_t* frame)
gPackageState.selected = false;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -229,10 +221,10 @@ static void enableChannelHandler(NetworkFrame_t* frame)
#if CXX_SIMULATOR
printf("Enable Channel: channel %x\n", ch);
#endif
- gPackageState.channel[ch].AsyncronousTrafficEn = true;
+ gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Enabled = true;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -245,10 +237,10 @@ static void disableChannelHandler(NetworkFrame_t* frame)
#if CXX_SIMULATOR
printf("Disable Channel: channel %x\n", ch);
#endif
- gPackageState.channel[ch].AsyncronousTrafficEn = false;
+ gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Enabled = false;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -264,7 +256,7 @@ static void resetChannelHandler(NetworkFrame_t* frame)
resetChannel(ch);
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -277,10 +269,10 @@ static void enableChannelNetworkTXHandler(NetworkFrame_t* frame)
#if CXX_SIMULATOR
printf("Enable Channel Network TX: channel %x\n", ch);
#endif
- gPackageState.channel[ch].PassthroughTXTrafficEn = false;
+ gPackageState.channel[ch].shm->NcsiChannelInfo.bits.TXPassthrough = false;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
@@ -295,10 +287,10 @@ static void disableChannelNetworkTXHandler(NetworkFrame_t* frame)
#if CXX_SIMULATOR
printf("Disable Channel Network TX: channel %x\n", ch);
#endif
- gPackageState.channel[ch].PassthroughTXTrafficEn = true;
+ gPackageState.channel[ch].shm->NcsiChannelInfo.bits.TXPassthrough = true;
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
response, reason);
@@ -306,9 +298,21 @@ static void disableChannelNetworkTXHandler(NetworkFrame_t* frame)
static void AENEnableHandler(NetworkFrame_t* frame)
{
+ int ch = frame->controlPacket.ChannelID & CHANNEL_ID_MASK;
+ uint32_t AENControl = (frame->AENEnable.AENControl_Low | (frame->AENEnable.AENControl_High << 16));
#if CXX_SIMULATOR
- printf("AEN Enable: channel %x\n", frame->controlPacket.ChannelID);
+ printf("AEN Enable: AEN_MC_ID %x\n", frame->AENEnable.AEN_MC_ID);
+ printf("AEN Enable: AENControl %x\n", AENControl);
#endif
+
+ gPackageState.channel[ch].shm->NcsiChannelMcid.r32 = frame->AENEnable.AEN_MC_ID;
+ gPackageState.channel[ch].shm->NcsiChannelMcid.r32 = AENControl;
+
+ sendNCSIResponse(
+ frame->controlPacket.InstanceID,
+ frame->controlPacket.ChannelID,
+ frame->controlPacket.ControlPacketType,
+ NCSI_RESPONSE_CODE_COMMAND_COMPLETE, NCSI_REASON_CODE_NONE);
}
static void setLinkHandler(NetworkFrame_t* frame)
@@ -331,8 +335,8 @@ static void getLinkStatusHandler(NetworkFrame_t* frame)
ncsi_handler_t gNCSIHandlers[] =
{
[0x00] = {.payloadLength = 0, .ignoreInit = true, .packageCommand = false, .fn = clearInitialStateHandler},
- [0x01] = {.payloadLength = 4, .ignoreInit = true, .packageCommand = true, .fn = selectPacakgeHandler},
- [0x02] = {.payloadLength = 0, .ignoreInit = true, .packageCommand = true, .fn = deselectPacakgeHandler},
+ [0x01] = {.payloadLength = 4, .ignoreInit = true, .packageCommand = true, .fn = selectPackageHandler},
+ [0x02] = {.payloadLength = 0, .ignoreInit = true, .packageCommand = true, .fn = deselectPackageHandler},
[0x03] = {.payloadLength = 0, .ignoreInit = false, .packageCommand = false, .fn = enableChannelHandler},
[0x04] = {.payloadLength = 4, .ignoreInit = false, .packageCommand = false, .fn = disableChannelHandler},
[0x05] = {.payloadLength = 4, .ignoreInit = false, .packageCommand = false, .fn = resetChannelHandler},
@@ -377,7 +381,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
#endif
// Channel does not exist.
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_FAILED,
@@ -391,7 +395,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
#endif
// Command not targeting correct channel/package..
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_FAILED,
@@ -399,7 +403,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
}
else if(false == handler->ignoreInit &&
false == handler->packageCommand && /* Pacakge commands don't target a channel */
- false == gPackageState.channel[ch].initialized)
+ false == gPackageState.channel[ch].shm->NcsiChannelInfo.bits.Ready)
{
#if CXX_SIMULATOR
printf("[%x] Channel not initialized: %d\n", command, ch);
@@ -408,7 +412,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
#endif
// Initialization required for the channel
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_FAILED,
@@ -421,7 +425,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
#endif
// Unexpected payload length
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_FAILED,
@@ -444,7 +448,7 @@ void handleNCSIFrame(NetworkFrame_t* frame)
#endif
// Unknown command.
sendNCSIResponse(
- frame->controlPacket.InstanceID,
+ frame->controlPacket.InstanceID,
frame->controlPacket.ChannelID,
frame->controlPacket.ControlPacketType,
NCSI_RESPONSE_CODE_COMMAND_UNSUPPORTED,
@@ -464,6 +468,7 @@ void resetChannel(int ch)
channel->AsyncronousTrafficEn = false;
channel->PassthroughTXTrafficEn = false;
+ channel->shm->NcsiChannelInfo.r32 = 0;
channel->shm->NcsiChannelCtrlstatRx.r32 = 0;
}
OpenPOWER on IntegriCloud