NT4/private/ntos/fw/mips/jzether.c
2020-09-30 17:12:29 +02:00

159 lines
4.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
jzether.c
Abstract:
This module contains the Jazz ethernet address setup code.
Author:
David M. Robinson (davidro) 9-Aug-1991
Revision History:
--*/
#include "jzsetup.h"
VOID
JzSetEthernet (
VOID
)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
ARC_STATUS Status;
UCHAR Address[8];
ULONG Index;
UCHAR Character;
ULONG Count;
ULONG Protected;
PUCHAR NvramAddress = (PUCHAR)NVRAM_SYSTEM_ID;
ULONG Nibble, ByteSum, CheckSum;
CHAR PromptAddress[16];
PCONFIGURATION_COMPONENT ParentComponent, NetworkComponent;
UCHAR Data[sizeof(CM_PARTIAL_RESOURCE_LIST) +
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * 8 +
sizeof(CM_FLOPPY_DEVICE_DATA)];
PCM_PARTIAL_RESOURCE_LIST List = (PCM_PARTIAL_RESOURCE_LIST)Data;
PCM_SONIC_DEVICE_DATA SonicDeviceData;
//
// Get and display current ethernet address.
//
for (Index = 0; Index < 8 ; Index++ ) {
Address[Index] = READ_REGISTER_UCHAR(&NvramAddress[Index]);
}
JzSetPosition( 3, 5);
JzPrint(JZ_CURRENT_ENET_MSG);
for (Index = 0; Index < 6 ; Index++) {
JzPrint("%02lx", Address[Index]);
}
JzSetPosition( 4, 5);
// Protected = READ_REGISTER_ULONG (&DMA_CONTROL->SystemSecurity.Long);
// if ((Protected & (~READ_ONLY_DISABLE_WRITE))==0) {
// JzPrint("The NVRAM is ReadOnly, cannot write new address\r\n");
// } else {
JzPrint(JZ_NEW_ENET_MSG);
while (FwGetString( PromptAddress,
sizeof(PromptAddress),
NULL,
4,
5 + strlen(JZ_NEW_ENET_MSG)) > GetStringEscape ) {
}
if (*PromptAddress == 0) {
return;
}
JzSetPosition( 5, 5);
if (strlen(PromptAddress) == 12) {
CheckSum=0;
for (Index = 0; Index < 12; Index += 2) {
//
// Convert each nibble pair to a byte.
//
Nibble = ((PromptAddress[Index] >= '0') && (PromptAddress[Index] <= '9')) ?
PromptAddress[Index] - '0' :
tolower(PromptAddress[Index]) - 'a' + 10;
ByteSum = (Nibble << 4);
Nibble = ((PromptAddress[Index+1] >= '0') && (PromptAddress[Index+1] <= '9')) ?
PromptAddress[Index+1] - '0' :
tolower(PromptAddress[Index+1]) - 'a' + 10;
ByteSum |= Nibble;
WRITE_REGISTER_UCHAR( &NvramAddress[Index/2], ByteSum);
CheckSum += ByteSum;
if (CheckSum >= 256) { // carry
CheckSum++; // Add the carry
CheckSum &= 0xFF; // remove it from bit 9
}
}
WRITE_REGISTER_UCHAR( &NvramAddress[6], 0);
WRITE_REGISTER_UCHAR( &NvramAddress[7], 0xFF - CheckSum);
for (Index = 0; Index < 8 ; Index++ ) {
Address[Index] = READ_REGISTER_UCHAR(&NvramAddress[Index]);
}
JzPrint(JZ_WRITTEN_ENET_MSG);
for (Index = 0; Index < 8 ; Index++) {
JzPrint("%02lx", Address[Index]);
}
JzSetPosition( 6, 5);
NetworkComponent = ArcGetComponent("multi()net()");
if ((NetworkComponent != NULL) &&
(NetworkComponent->Type == NetworkController)) {
JzPrint(JZ_FOUND_NET_MSG);
ParentComponent = ArcGetParent(NetworkComponent);
if (ArcDeleteComponent(NetworkComponent) == ESUCCESS) {
JzAddNetwork( ParentComponent );
JzPrint(JZ_FIXED_MSG);
} else {
JzPrint(JZ_NOT_FIXED_MSG);
}
}
} else {
JzPrint(JZ_INVALID_ENET_MSG);
}
// }
//
// Save configuration in Nvram.
//
JzSetPosition( 7, 4);
JzPrint(JZ_SAVE_CONFIG_MSG);
ArcSaveConfiguration();
JzSetPosition( 8, 4);
FwWaitForKeypress();
}