Annotation of ntddk/src/network/lance/dectc.c, revision 1.1

1.1     ! root        1: #ifndef i386   // No INTEL system has a TurboChannel bus.
        !             2: 
        !             3: /*++
        !             4: 
        !             5: Copyright (c) 1990  Microsoft Corporation
        !             6: 
        !             7: Module Name:
        !             8: 
        !             9:    dectc.c
        !            10: 
        !            11: Abstract:
        !            12: 
        !            13:    This is the implementation of the card specific callbacks for the
        !            14:    DEC TurboChannel option for the Advanced Micro Devices LANCE (Am 7990)
        !            15:    Ethernet controller.
        !            16: 
        !            17: Author:
        !            18: 
        !            19: Environment:
        !            20: 
        !            21: Revision History:
        !            22: 
        !            23:    31-Jul-1992  R.D. Lanser:
        !            24: 
        !            25:       Moved/copied code from 'lance.c' to this file for all DEC
        !            26:       TurboChannel (PMAD-AA) specific code.
        !            27: 
        !            28: --*/
        !            29: 
        !            30: #include <ndis.h>
        !            31: #include <efilter.h>
        !            32: #include "lancehrd.h"
        !            33: #include "lancesft.h"
        !            34: #include "dectc.h"
        !            35: 
        !            36: 
        !            37: NDIS_STATUS
        !            38: LanceDecTcGetConfiguration(
        !            39:    NDIS_HANDLE ConfigHandle,
        !            40:    PLANCE_ADAPTER PAdapter
        !            41:    )
        !            42: /*++
        !            43: Routine Description:
        !            44: 
        !            45:    This is the Digital TurboChannel configuration routine.  This routine
        !            46:    extracts configuration information from the configuration data base.
        !            47: 
        !            48: Arguments:
        !            49: 
        !            50:     ConfigHandle - Handle for configuration database.
        !            51:     PAdapter - Pointer for the adapter root.
        !            52: 
        !            53: Return Value:
        !            54: 
        !            55:    NDIS_STATUS_SUCCESS - Configuration get was successfully.
        !            56:    NDIS_STATUS_FAILURE - Configuration get was unsuccessfully.
        !            57: 
        !            58: --*/
        !            59: 
        !            60: 
        !            61: {
        !            62:    NDIS_STATUS status = NDIS_STATUS_SUCCESS;
        !            63: 
        !            64:    enum {
        !            65:       CS_FIRST_INDEX = 0,
        !            66:       INTERRUPT_VECTOR = CS_FIRST_INDEX,
        !            67:       IRQL,
        !            68:       BASE_ADDR,
        !            69:       CS_NUM_OF_ENTRIES
        !            70:    } csIndex;
        !            71: 
        !            72:    NDIS_STRING configString[CS_NUM_OF_ENTRIES] = {
        !            73:       NDIS_STRING_CONST("InterruptVector"),
        !            74:       NDIS_STRING_CONST("InterruptRequestLevel"),
        !            75:       NDIS_STRING_CONST("BaseAddress"),
        !            76:    };
        !            77: 
        !            78:    UINT csCount = 0;
        !            79: 
        !            80:    for (csIndex = CS_FIRST_INDEX; csIndex < CS_NUM_OF_ENTRIES; csIndex++) {
        !            81: 
        !            82:       NDIS_STATUS returnedStatus;
        !            83:       PNDIS_CONFIGURATION_PARAMETER returnedValue;
        !            84: 
        !            85:       //
        !            86:       // Read the configuration entry
        !            87:       //
        !            88: 
        !            89:       NdisReadConfiguration(
        !            90:          &returnedStatus,
        !            91:          &returnedValue,
        !            92:          ConfigHandle,
        !            93:          &(configString[csIndex]),
        !            94:          NdisParameterInteger
        !            95:          );
        !            96: 
        !            97:       if (returnedStatus == NDIS_STATUS_SUCCESS) {
        !            98: 
        !            99:          switch (csIndex) {
        !           100: 
        !           101:          case INTERRUPT_VECTOR:
        !           102:             PAdapter->InterruptNumber =
        !           103:                returnedValue->ParameterData.IntegerData;
        !           104:             break;
        !           105:          case IRQL:
        !           106:             PAdapter->InterruptRequestLevel =
        !           107:                returnedValue->ParameterData.IntegerData;
        !           108:             break;
        !           109:          case BASE_ADDR:
        !           110:             PAdapter->HardwareBaseAddr = (PVOID)
        !           111:                (returnedValue->ParameterData.IntegerData);
        !           112:             break;
        !           113:          default:
        !           114:             continue;
        !           115:          }
        !           116: 
        !           117:          csCount++;
        !           118: 
        !           119:       } else {
        !           120: 
        !           121:          status = returnedStatus;
        !           122: 
        !           123: #if DBG
        !           124:          {
        !           125:             PCCHAR str[CS_NUM_OF_ENTRIES] = {
        !           126:                "InterruptVector",
        !           127:                "InterruptRequestLevel",
        !           128:                "BaseAddress"
        !           129:                } ;
        !           130:             DbgPrint("LANCE:  Configuration parameter '%s' not found",
        !           131:                str[csIndex]);
        !           132:          }
        !           133: #endif
        !           134: 
        !           135:       }
        !           136: 
        !           137:    } // for (csIndex ...
        !           138: 
        !           139:    //
        !           140:    // Fill in the rest of the configuration.
        !           141:    //
        !           142: 
        !           143:    if (status == NDIS_STATUS_SUCCESS) {
        !           144:       if (csCount == CS_NUM_OF_ENTRIES) {
        !           145: 
        !           146:          //
        !           147:          // Treat the RAP, RDP, and NetworkHardwareAddress as port numbers
        !           148:          // (offsets from the first register).  This will allow the
        !           149:          // usage of the Ndis{Read/Write}Portxxx macros after the port
        !           150:          // offset address is fixed up in LanceDecTcSoftwareDetails.
        !           151:          //
        !           152: 
        !           153:          //
        !           154:          // The amount of dual ported memory.
        !           155:          //
        !           156:          PAdapter->AmountOfHardwareMemory = LANCE_DECTC_HARDWARE_MEMORY;
        !           157:          //
        !           158:          // The offset of this memory from the base address.
        !           159:          //
        !           160:          PAdapter->HardwareBaseOffset = 0;
        !           161:          //
        !           162:          // The register offsets from the base address.
        !           163:          //
        !           164:          PAdapter->RAP = (ULONG) LANCE_DECTC_RAP_OFFSET;
        !           165:          PAdapter->RDP = (ULONG) LANCE_DECTC_RDP_OFFSET;
        !           166:          //
        !           167:          // Not used for this adapter, simply null it.
        !           168:          //
        !           169:          PAdapter->Nicsr = (ULONG)NULL;
        !           170:          //
        !           171:          // And the offset from the base address for the hardware address.
        !           172:          //
        !           173:          PAdapter->NetworkHardwareAddress = LANCE_DECTC_NETWORK_OFFSET;
        !           174: 
        !           175:       } else {
        !           176: 
        !           177:          //
        !           178:          // Insufficient configuration data.
        !           179:          //
        !           180:          status = NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION;
        !           181: 
        !           182:       }
        !           183:    }
        !           184: 
        !           185:    return status;
        !           186: }
        !           187: 
        !           188: NDIS_STATUS
        !           189: LanceDecTcGetInformation(
        !           190:    PLANCE_ADAPTER PAdapter,
        !           191:    PNDIS_ADAPTER_INFORMATION PAdapterInformation
        !           192:    )
        !           193: /*++
        !           194: Routine Description:
        !           195: 
        !           196:    This routine completes any additional setup after the adapter is registered.
        !           197: 
        !           198: Arguments:
        !           199: 
        !           200:     PAdapter - Pointer for the adapter root.
        !           201: 
        !           202:     PAdapterInformation - Pointer for adapter information structure.
        !           203: 
        !           204: Return Value:
        !           205: 
        !           206: 
        !           207:    NDIS_STATUS_SUCCESS - Information get was successfully.
        !           208:    NDIS_STATUS_FAILURE - Information get was unsuccessfully.
        !           209: 
        !           210: --*/
        !           211: 
        !           212: 
        !           213: {
        !           214: 
        !           215:    //
        !           216:    // This is not an ISA/EISA adapter and uses memory mapped registers.
        !           217:    // Therefore, simply utilize the Ndis code like these were I/O ports
        !           218:    // by setting the InitialPort to the HardwareBaseAddress and the
        !           219:    // NumberOfPorts to the number of bytes to map.  LanceDecTcSoftwareDetails
        !           220:    // sets the port offset to be the memory mapped address of the registers.
        !           221:    // The port number is then offset from this base address.
        !           222:    // The NdisRead/WritePortxxxx macros end up being read/write
        !           223:    // register code for non-INTEL systems and it all just works.
        !           224:    //
        !           225: 
        !           226:    PAdapterInformation->DmaChannel = PAdapter->InterruptNumber;
        !           227:    PAdapterInformation->AdapterType = NdisInterfaceTurboChannel;
        !           228: 
        !           229:    //
        !           230:    // PhysicalMapRegistersNeeded determines how many channesl to allocate.
        !           231:    //
        !           232: 
        !           233:    PAdapterInformation->PhysicalMapRegistersNeeded = 0;
        !           234: 
        !           235:    //
        !           236:    // MaximumPhysicalMapping determines how many map registers are
        !           237:    // needed per channel.
        !           238:    //
        !           239: 
        !           240:    PAdapterInformation->MaximumPhysicalMapping = 0;
        !           241: 
        !           242:    //
        !           243:    // Number of port descriptors says how many map regions there will be.
        !           244:    //
        !           245: 
        !           246:    PAdapterInformation->NumberOfPortDescriptors = 1;
        !           247: 
        !           248:    //
        !           249:    // Ask for all registers and the network hardware address to be mapped.
        !           250:    //
        !           251: 
        !           252:    PAdapterInformation->PortDescriptors[0].InitialPort =
        !           253:       (ULONG)(PAdapter->HardwareBaseAddr) + LANCE_DECTC_REGISTER_OFFSET;
        !           254:    PAdapterInformation->PortDescriptors[0].NumberOfPorts =
        !           255:        LANCE_DECTC_REGISTER_MAPSIZE;
        !           256: 
        !           257:    return NDIS_STATUS_SUCCESS;
        !           258: }
        !           259: 
        !           260: NDIS_STATUS
        !           261: LanceDecTcSoftwareDetails(
        !           262:    PLANCE_ADAPTER PAdapter
        !           263:    )
        !           264: /*++
        !           265: Routine Description:
        !           266: 
        !           267:    Set buffer sizes and number of rings.  Also, fixe the port mapping
        !           268:    offset address to avoid large unsigned subtractions in NDIS.  See
        !           269:    the following macros in lancehrd.h:
        !           270: 
        !           271:    LANCE_ISR_WRITE_RAP(A,C)   NdisWritePortUshort (...
        !           272:    LANCE_ISR_READ_RDP(A,C)    NdisReadPortUshort  (...
        !           273:    LANCE_ISR_WRITE_RDP(A,C)   NdisWritePortUshort (...
        !           274:    LANCE_ISR_WRITE_NICSR(A,C) NdisWritePortUshort (...
        !           275: 
        !           276:    The port offset is the mapped address base, and the port number is
        !           277:    the offset from that base (confused yet?).
        !           278: 
        !           279: Arguments:
        !           280: 
        !           281:     PAdapter - Pointer for the adapter root.
        !           282: 
        !           283: Return Value:
        !           284: 
        !           285:    NDIS_STATUS_SUCCESS - Configuration get was successfully.
        !           286:    NDIS_STATUS_RESOURCES - Insufficient resources.
        !           287: 
        !           288: --*/
        !           289: 
        !           290: 
        !           291: {
        !           292:    NDIS_STATUS status = NDIS_STATUS_SUCCESS;
        !           293:    PNDIS_ADAPTER_BLOCK adapterBlock = PAdapter->NdisAdapterHandle;
        !           294: 
        !           295:    //
        !           296:    // Patch up the PortOffset for NdisWritePortxxx and NdisReadPortxxx.
        !           297:    // The port number is now simply the offset from the first register.
        !           298:    //
        !           299: 
        !           300:    adapterBlock->PortOffset = adapterBlock->InitialPortMapping;
        !           301: 
        !           302:    //
        !           303:    // Set buffer sizes and number of rings.
        !           304:    //
        !           305: 
        !           306:    PAdapter->SizeOfReceiveBuffer  = LANCE_128K_SIZE_OF_RECEIVE_BUFFERS;
        !           307:    PAdapter->NumberOfSmallBuffers = LANCE_128K_NUMBER_OF_SMALL_BUFFERS;
        !           308:    PAdapter->NumberOfMediumBuffers= LANCE_128K_NUMBER_OF_MEDIUM_BUFFERS;
        !           309:    PAdapter->NumberOfLargeBuffers = LANCE_128K_NUMBER_OF_LARGE_BUFFERS;
        !           310: 
        !           311:    PAdapter->NumberOfReceiveRings = LANCE_128K_NUMBER_OF_RECEIVE_RINGS;
        !           312:    PAdapter->LogNumberReceiveRings = LANCE_128K_LOG_RECEIVE_RINGS;
        !           313: 
        !           314:    return NDIS_STATUS_SUCCESS;
        !           315: }
        !           316: 
        !           317: NDIS_STATUS
        !           318: LanceDecTcHardwareDetails(
        !           319:    PLANCE_ADAPTER PAdapter
        !           320:    )
        !           321: /*++
        !           322: Routine Description:
        !           323: 
        !           324:    This routine extracts the network hardware address.
        !           325: 
        !           326: Arguments:
        !           327: 
        !           328:     PAdapter - Pointer for the adapter root.
        !           329: 
        !           330: Return Value:
        !           331: 
        !           332: 
        !           333:    NDIS_STATUS_SUCCESS - Success.
        !           334:    NDIS_STATUS_FAILURE - Failure.
        !           335: 
        !           336: --*/
        !           337: 
        !           338: 
        !           339: {
        !           340:    NDIS_HANDLE handle = PAdapter->NdisAdapterHandle;
        !           341:    ULONG port;
        !           342:    ULONG registerValue;
        !           343: 
        !           344: 
        !           345: 
        !           346:    port = (ULONG)(PAdapter->NetworkHardwareAddress);
        !           347:    NdisReadPortUlong(handle, port, &registerValue);
        !           348: 
        !           349:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           350:    PAdapter->NetworkAddress[0] = registerValue;
        !           351: 
        !           352:    port += sizeof(ULONG);
        !           353:    NdisReadPortUlong(handle, port, &registerValue);
        !           354:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           355:    PAdapter->NetworkAddress[1] = registerValue;
        !           356: 
        !           357: 
        !           358:    port += sizeof(ULONG);
        !           359:    NdisReadPortUlong(handle, port, &registerValue);
        !           360:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           361:    PAdapter->NetworkAddress[2] = registerValue;
        !           362: 
        !           363: 
        !           364:    port += sizeof(ULONG);
        !           365:    NdisReadPortUlong(handle, port, &registerValue);
        !           366:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           367:    PAdapter->NetworkAddress[3] = registerValue;
        !           368: 
        !           369: 
        !           370:    port += sizeof(ULONG);
        !           371:    NdisReadPortUlong(handle, port, &registerValue);
        !           372:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           373:    PAdapter->NetworkAddress[4] = registerValue;
        !           374: 
        !           375: 
        !           376:    port += sizeof(ULONG);
        !           377:    NdisReadPortUlong(handle, port, &registerValue);
        !           378:    registerValue = (registerValue & 0x00ff0000u) >> 16;
        !           379:    PAdapter->NetworkAddress[5] = registerValue;
        !           380: 
        !           381:    return NDIS_STATUS_SUCCESS;
        !           382: }
        !           383: #endif // i386

unix.superglobalmegacorp.com

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