File:  [WindowsNT SDKs] / ntddk / src / network / lance / details.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:31:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntddk-nov-1993, HEAD
Microsoft Windows NT Build 511 (DDK SDK) 11-01-1993

/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    transfer.c

Abstract:

    This file implements the routine that does very architecture
    specific things.

Author:

    Anthony V. Ercolano (Tonye) 02-Oct-1990

Environment:

    Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.

Revision History:

    Sean Selitrennikoff (SeanSe) 10/20/91
        Added code to deal with a DecstationPC

    31-Jul-1992  R.D. Lanser:

       Moved DEC TurboChannel (PMAD-AA) code to adapter specific routine.

--*/


#include <ndis.h>
#include <efilter.h>
#include <lancehrd.h>
#include <lancesft.h>


extern
BOOLEAN
LanceHardwareDetails(
    IN PLANCE_ADAPTER Adapter
    )

/*++

Routine Description:

    This routine gets the network address from the hardware.

Arguments:

    Adapter - Where to store the network address.

Return Value:

    TRUE - if successful.

--*/

{
    UCHAR Signature[] = { 0xff, 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa};
    UCHAR BytesRead[8];

    UINT ReadCount;

    UINT Place;

    //
    // Reset E-PROM state
    //
    // To do this we first read from the E-PROM address until the
    // specific signature is reached (then the next bytes read from
    // the E-PROM address will be the ethernet address of the card).
    //



    //
    // Read first part of the signature
    //

    for (Place=0; Place < 8; Place++){

        NdisReadPortUchar(Adapter->NdisAdapterHandle,
                          (ULONG)(Adapter->NetworkHardwareAddress),
                          &(BytesRead[Place]));

    }

    ReadCount = 8;

    //
    // This advances to the front of the circular buffer.
    //

    while (ReadCount < 40) {

        //
        // Check if we have read the signature.
        //

        for (Place = 0; Place < 8; Place++){

            if (BytesRead[Place] != Signature[Place]){

                Place = 10;
                break;

            }

        }

        //
        // If we have read the signature, stop.
        //

        if (Place != 10){

            break;

        }

        //
        // else, move all the bytes down one and read then
        // next byte.
        //

        for (Place = 0; Place < 7; Place++){

            BytesRead[Place] = BytesRead[Place+1];

        }

        NdisReadPortUchar(Adapter->NdisAdapterHandle,
                          (ULONG)(Adapter->NetworkHardwareAddress),
                          &(BytesRead[7]));

        ReadCount++;
    }


    if (ReadCount == 40){

        return(FALSE);

    }


    //
    // Now read the ethernet address of the card.
    //


    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[0])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[1])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[2])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[3])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[4])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[5])
                      );



    if (!(Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422))) {

        if (Adapter->LanceCard == LANCE_DEPCA){

            //
            // Reset Lan Interface port.
            //

            NdisWritePortUchar(Adapter->NdisAdapterHandle,
                               (ULONG)(LANCE_DEPCA_LAN_CFG_ADDRESS),
                               0x00);

            //
            // Reset Network Interface Control Status Register
            //

            NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);
        }

        return(TRUE);

    }




    //
    // Now do the EPROM Hardware check as outlined in the tech ref.
    //


    //
    // Check for NULL address.
    //

    for (Place = 0; Place < 6; Place++) {

        if (Adapter->NetworkAddress[Place] != 0) {

            Place = 10;
            break;

        }

    }

    if (Place != 10) {

        return(FALSE);

    }



    //
    // Check that bit 0 is not a 1
    //

    if (Adapter->NetworkAddress[0] & 0x1) {

        return(FALSE);

    }





    //
    // Check that octet[0]->octet[7] == octet[15]->octet[8]
    //

    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[6])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[7])
                      );

    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );

    if ((BytesRead[7] != BytesRead[0]) ||
        (BytesRead[6] != BytesRead[1])) {

        return(FALSE);

    }


    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[5])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[4])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[3])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[2])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );

    for (Place = 0; Place < 6; Place++) {

        if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {

            return(FALSE);

        }

    }


    //
    // Check that octet[0]->octet[8] == octet[16]->octet[23]
    //

    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[2])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[3])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[4])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[5])
                      );

    for (Place = 0; Place < 6; Place++) {

        if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {

            return(FALSE);

        }

    }


    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );

    if ((BytesRead[6] != BytesRead[0]) ||
        (BytesRead[7] != BytesRead[1])) {

        return(FALSE);

    }

    //
    // Check that octet[24] -> octet[31] == signature bytes
    //


    for (Place = 0; Place < 8; Place++){


        NdisReadPortUchar(Adapter->NdisAdapterHandle,
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[Place])
                      );

        if (BytesRead[Place] != Signature[Place]){

#if DBG
            DbgPrint("Lance: Hardware failure\n");
#endif
            return(FALSE);

        }

    }

    if (Adapter->LanceCard == LANCE_DEPCA){

        //
        // Reset Lan Interface port.
        //

        NdisWritePortUchar(Adapter->NdisAdapterHandle,
                           (ULONG)(LANCE_DEPCA_LAN_CFG_ADDRESS),
                           0x00);

        //
        // Reset Network Interface Control Status Register
        //

        NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);
    }

    if (Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422)) {

        //
        // Reset Network Interface Control Status Register
        //

        NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);

    }

    return(TRUE);

}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.