156 lines
4.9 KiB
C
156 lines
4.9 KiB
C
|
/*****************************************************************************
|
||
|
** **
|
||
|
** COPYRIGHT (C) 2000, 2001 MKNET CORPORATION **
|
||
|
** DEVELOPED FOR THE MK7100-BASED VFIR PCI CONTROLLER. **
|
||
|
** **
|
||
|
*****************************************************************************/
|
||
|
|
||
|
/**********************************************************************
|
||
|
|
||
|
Module Name:
|
||
|
WINPCI.C
|
||
|
|
||
|
Routines:
|
||
|
FindAndSetupPciDevice
|
||
|
|
||
|
Comments:
|
||
|
Windows-NDIS PCI.
|
||
|
|
||
|
**********************************************************************/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Procedure: [FindAndSetupPciDevice]
|
||
|
//
|
||
|
// Description: This routine finds an adapter for the driver to load on
|
||
|
// The critical piece to understanding this routine is that
|
||
|
// the System will not let us read any information from PCI
|
||
|
// space from any slot but the one that the System thinks
|
||
|
// we should be using. The configuration manager rules this
|
||
|
// land... The Slot number used by this routine is just a
|
||
|
// placeholder, it could be zero even.
|
||
|
//
|
||
|
// This code has enough flexibility to support multiple
|
||
|
// PCI adapters. For now we only do one.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// Adapter - ptr to Adapter object instance
|
||
|
// VendorID - Vendor ID of the adapter.
|
||
|
// DeviceID - Device ID of the adapter.
|
||
|
// PciCardsFound - A structure that contains an array of the IO addresses,
|
||
|
// IRQ, and node addresses of each PCI card that we find.
|
||
|
//
|
||
|
// NOTE: due to NT 5's Plug and Play configuration manager
|
||
|
// this routine will never return more than one device.
|
||
|
//
|
||
|
// Returns:
|
||
|
// USHORT - Number of MK7 based PCI adapters found in the scanned bus
|
||
|
//-----------------------------------------------------------------------------
|
||
|
USHORT FindAndSetupPciDevice(IN PMK7_ADAPTER Adapter,
|
||
|
NDIS_HANDLE WrapperConfigurationContext,
|
||
|
IN USHORT VendorID,
|
||
|
IN USHORT DeviceID,
|
||
|
OUT PPCI_CARDS_FOUND_STRUC pPciCardsFound )
|
||
|
{
|
||
|
NDIS_STATUS stat;
|
||
|
ULONG Device_Vendor_Id = 0;
|
||
|
USHORT Slot = 0;
|
||
|
|
||
|
/*
|
||
|
* We should only need 2 adapter resources (2 IO and 1 interrupt),
|
||
|
* but I've seen devices get extra resources.
|
||
|
* So give the NdisMQueryAdapterResources call room for 10 resources.
|
||
|
*/
|
||
|
#define RESOURCE_LIST_BUF_SIZE (sizeof(NDIS_RESOURCE_LIST) + (10*sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)))
|
||
|
UCHAR buf[RESOURCE_LIST_BUF_SIZE];
|
||
|
PNDIS_RESOURCE_LIST resList = (PNDIS_RESOURCE_LIST)buf;
|
||
|
UINT bufSize = RESOURCE_LIST_BUF_SIZE;
|
||
|
|
||
|
|
||
|
//****************************************
|
||
|
// Verify the device is ours.
|
||
|
//****************************************
|
||
|
NdisReadPciSlotInformation(
|
||
|
Adapter->MK7AdapterHandle,
|
||
|
Slot,
|
||
|
PCI_VENDOR_ID_REGISTER,
|
||
|
(PVOID) &Device_Vendor_Id,
|
||
|
sizeof (ULONG));
|
||
|
|
||
|
if ( (((USHORT) Device_Vendor_Id) != VendorID) ||
|
||
|
(((USHORT) (Device_Vendor_Id >> 16)) != DeviceID) ) {
|
||
|
pPciCardsFound->NumFound = 0;
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
//****************************************
|
||
|
// Controller revision id
|
||
|
//****************************************
|
||
|
NdisReadPciSlotInformation(
|
||
|
Adapter->MK7AdapterHandle,
|
||
|
Slot,
|
||
|
PCI_REV_ID_REGISTER,
|
||
|
&pPciCardsFound->PciSlotInfo[0].ChipRevision,
|
||
|
sizeof(pPciCardsFound->PciSlotInfo[0].ChipRevision));
|
||
|
|
||
|
|
||
|
//****************************************
|
||
|
// SubDevice and SubVendor ID
|
||
|
// (We may want this in the future.)
|
||
|
//****************************************
|
||
|
// NdisReadPciSlotInformation(
|
||
|
// Adapter->MK7AdapterHandle,
|
||
|
// Slot,
|
||
|
// PCI_SUBVENDOR_ID_REGISTER,
|
||
|
// &pPciCardsFound->PciSlotInfo[found].SubVendor_DeviceID,
|
||
|
// 0x4);
|
||
|
//
|
||
|
|
||
|
pPciCardsFound->PciSlotInfo[0].SlotNumber = (USHORT) 0;
|
||
|
|
||
|
|
||
|
NdisMQueryAdapterResources(&stat, WrapperConfigurationContext, resList, &bufSize);
|
||
|
if (stat == NDIS_STATUS_SUCCESS) {
|
||
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR resDesc;
|
||
|
BOOLEAN haveIRQ = FALSE,
|
||
|
haveIOAddr = FALSE;
|
||
|
UINT i;
|
||
|
|
||
|
for (resDesc = resList->PartialDescriptors, i = 0;
|
||
|
i < resList->Count;
|
||
|
resDesc++, i++) {
|
||
|
|
||
|
switch (resDesc->Type) {
|
||
|
case CmResourceTypePort:
|
||
|
if (!haveIOAddr) {
|
||
|
if (resDesc->Flags & CM_RESOURCE_PORT_IO) {
|
||
|
pPciCardsFound->PciSlotInfo[0].BaseIo =
|
||
|
resDesc->u.Port.Start.LowPart;
|
||
|
haveIOAddr = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CmResourceTypeInterrupt:
|
||
|
if (!haveIRQ) {
|
||
|
pPciCardsFound->PciSlotInfo[0].Irq =
|
||
|
(UCHAR) (resDesc->u.Port.Start.LowPart);
|
||
|
haveIRQ = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case CmResourceTypeMemory:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(1);
|
||
|
}
|
||
|
|