mulagi
驱动牛犊
驱动牛犊
  • 注册日期2004-08-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1246回复:0

谁看过源码下载里的rtl8139 for 2k的代码了

楼主#
更多 发布于:2005-04-05 10:28
感觉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]
游客

返回顶部