阅读:1246回复:0
谁看过源码下载里的rtl8139 for 2k的代码了
感觉RInit是不是有问题啊
调用NdisReadPciSlotInformation时怎么直接指定slot number 为0,下面调用NdisMPciAssignResources又指定slot number 为i了, NDIS_STATUS RInit( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, IN UINT MediumArraySize, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE WrapperConfigurationContext ) { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UINT i; ULONG ulReadSize; ULONG ulVenDevID; PNDIS_RESOURCE_LIST resList; CM_PARTIAL_RESOURCE_DESCRIPTOR resDesc; PADAPTER adapter; NDIS_HANDLE ConfigurationHandle; USHORT TmpCommand; KdPrint((\"go into RInit \\n\")); for (i = 0; i < MediumArraySize; i++){ if (MediumArray == NdisMedium802_3) break; } if (i == MediumArraySize){ KdPrint((\"802.3 Media type not found.\\n\")); return NDIS_STATUS_UNSUPPORTED_MEDIA; } // Select ethernet *SelectedMediumIndex = i; //alloc adapter context mem Status = NdisAllocateMemoryWithTag( &adapter, sizeof(ADAPTER), \'9318\' ); if(Status != NDIS_STATUS_SUCCESS) goto err; NdisZeroMemory(adapter, sizeof(ADAPTER)); g_adapter = adapter; adapter->MiniportAdapterHandle = MiniportAdapterHandle; adapter->WrapperConfigurationContext = WrapperConfigurationContext; //find resourcs ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////调用NdisReadPciSlotInformation时怎么直接指定slot number 为0,下面调用NdisMPciAssignResources又指定slot number 为i了, 是不是应该用个循环来查询是不是ulVenDevID == 0x813910ec ulReadSize = NdisReadPciSlotInformation( MiniportAdapterHandle, 0, 0, &ulVenDevID, 4 ); if(ulVenDevID != 0x813910ec){ DbgPrint(\"no find our nic card. \\n\"); Status = NDIS_STATUS_FAILURE; goto err; } //我们的设备,获得资源 Status = NdisMPciAssignResources( MiniportAdapterHandle, i, &resList ); if(Status != NDIS_STATUS_SUCCESS) goto err; for(i = 0; i < resList->Count; i ++){ resDesc = resList->PartialDescriptors; switch(resDesc.Type){ // I/O 端口 case CmResourceTypePort: adapter->BaseIO = (ULONG)resDesc.u.Port.Start.LowPart; ASSERT(0x100 == resDesc.u.Port.Length); break; // IRQ case CmResourceTypeInterrupt: adapter->IRQLevel = resDesc.u.Interrupt.Level; adapter->IRQVector = resDesc.u.Interrupt.Vector; adapter->IRQAffinity = resDesc.u.Interrupt.Affinity; //share adapter->IRQMode = resDesc.Flags & (CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE | CM_RESOURCE_INTERRUPT_LATCHED); break; // MEMERY case CmResourceTypeMemory: ASSERT(0x100 == resDesc.u.Memory.Length); break; // DMA case CmResourceTypeDma: break; default: break; } }//for //regist to NDIS library NdisMSetAttributes( MiniportAdapterHandle, adapter, TRUE,//DMABusMaster, NdisInterfacePci ); //enable dma NdisReadPciSlotInformation( adapter->MiniportAdapterHandle, 0, PCI_COMMAND, &TmpCommand, 2 ); TmpCommand |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER; NdisWritePciSlotInformation( adapter->MiniportAdapterHandle, 0, PCI_COMMAND, &TmpCommand, 2 ); //Registering Ports Status = NdisMRegisterIoPortRange( (PVOID*)&adapter->ioaddr, adapter->MiniportAdapterHandle, adapter->BaseIO, 0x100 ); if(NDIS_STATUS_SUCCESS != Status) goto err; //interrupt Status = NdisMRegisterInterrupt( &adapter->IntObj, adapter->MiniportAdapterHandle, adapter->IRQVector, adapter->IRQLevel, TRUE, TRUE, adapter->IRQMode ); if(NDIS_STATUS_SUCCESS != Status) goto err; //dma Status = NdisMAllocateMapRegisters( adapter->MiniportAdapterHandle, 0,//must 0 CM_RESOURCE_DMA_32, 1, 256//dma transtrate max = 2k ); if(NDIS_STATUS_SUCCESS != Status) goto err; //RESET ResetNIC(adapter); ((USHORT*)adapter->NetworkAddress)[0] = opEEPROM((PUCHAR)(adapter->ioaddr+Cfg9346), 7, OP_READ, 0); ((USHORT*)adapter->NetworkAddress)[1] = opEEPROM((PUCHAR)(adapter->ioaddr+Cfg9346), 8, OP_READ, 0); ((USHORT*)adapter->NetworkAddress)[2] = opEEPROM((PUCHAR)(adapter->ioaddr+Cfg9346), 9, OP_READ, 0); DbgPrint(\"NodeAddress = %x-%x-%x-%x-%x-%x \\n\", adapter->NetworkAddress[0],adapter->NetworkAddress[1],adapter->NetworkAddress[2],adapter->NetworkAddress[3],adapter->NetworkAddress[4],adapter->NetworkAddress[5] ); Status = AllocRes(adapter); if(NDIS_STATUS_SUCCESS != Status) goto err; Status = StartDevice(adapter); if(NDIS_STATUS_SUCCESS != Status) goto err; KdPrint((\"claim system resource succeesfully. \\n\")); return Status; err: KdPrint((\"claim system resource failure. \\n\")); FreeRes(adapter); return Status; } [编辑 - 4/5/05 by mulagi] [编辑 - 4/5/05 by mulagi] |
|