📄 mp_init.c
字号:
{
Status = MP_ALLOCMEMTAG(&Adapter->BundleId.Buffer,
ReturnedValue->ParameterData.StringData.Length + sizeof(WCHAR));
if (Status == NDIS_STATUS_SUCCESS)
{
Adapter->BundleId.MaximumLength =
ReturnedValue->ParameterData.StringData.Length + sizeof(WCHAR);
NdisUpcaseUnicodeString(
&Adapter->BundleId,
&ReturnedValue->ParameterData.StringData);
}
else
{
DBGPRINT(MP_ERROR, ("Failed to allocate memory - BundleIdentifier\n"));
}
}
}
else
{
// This parameter is optional, set status to SUCCESS
Status = NDIS_STATUS_SUCCESS;
}
}
#endif
// Close the registry
NdisCloseConfiguration(ConfigurationHandle);
// Decode SpeedDuplex
if (Status == NDIS_STATUS_SUCCESS && Adapter->SpeedDuplex)
{
switch(Adapter->SpeedDuplex)
{
case 1:
Adapter->AiTempSpeed = 10; Adapter->AiForceDpx = 1;
break;
case 2:
Adapter->AiTempSpeed = 10; Adapter->AiForceDpx = 2;
break;
case 3:
Adapter->AiTempSpeed = 100; Adapter->AiForceDpx = 1;
break;
case 4:
Adapter->AiTempSpeed = 100; Adapter->AiForceDpx = 2;
break;
}
}
DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
return Status;
}
NDIS_STATUS NICAllocAdapterMemory(
IN PMP_ADAPTER Adapter)
/*++
Routine Description:
Allocate all the memory blocks for send, receive and others
Arguments:
Adapter Pointer to our adapter
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_FAILURE
NDIS_STATUS_RESOURCES
--*/
{
NDIS_STATUS Status;
PMP_TXBUF pMpTxbuf;
PUCHAR pMem;
ULONG MemPhys;
LONG index;
ULONG ErrorValue = 0;
UINT MaxNumBuffers;
#if OFFLOAD
BOOLEAN OffloadSharedMemSuccess = FALSE;
UINT i;
#endif
DBGPRINT(MP_TRACE, ("--> NICAllocMemory\n"));
DBGPRINT(MP_INFO, ("NumTcb=%d\n", Adapter->NumTcb));
Adapter->NumTbd = Adapter->NumTcb * NIC_MAX_PHYS_BUF_COUNT;
do
{
#if OFFLOAD
Status = NdisMInitializeScatterGatherDma(
Adapter->AdapterHandle,
FALSE,
LARGE_SEND_OFFLOAD_SIZE);
#else
Status = NdisMInitializeScatterGatherDma(
Adapter->AdapterHandle,
FALSE,
NIC_MAX_PACKET_SIZE);
#endif
if (Status == NDIS_STATUS_SUCCESS)
{
MP_SET_FLAG(Adapter, fMP_ADAPTER_SCATTER_GATHER);
}
else
{
DBGPRINT(MP_WARN, ("Failed to init ScatterGather DMA\n"));
//
// NDIS 5.1 miniport should NOT use map registers
//
ErrorValue = ERRLOG_OUT_OF_SG_RESOURCES;
break;
}
//
// Send + Misc
//
//
// Allocate MP_TCB's
//
Adapter->MpTcbMemSize = Adapter->NumTcb * sizeof(MP_TCB);
Status = MP_ALLOCMEMTAG(&pMem, Adapter->MpTcbMemSize);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_MEMORY;
DBGPRINT(MP_ERROR, ("Failed to allocate MP_TCB's\n"));
break;
}
NdisZeroMemory(pMem, Adapter->MpTcbMemSize);
Adapter->MpTcbMem = pMem;
//
// Now the driver needs to allocate send buffer pool, the number
// of send buffers the driver needs is the larger one of Adapter->NumBuffer
// and Adapter->NumTcb.
//
MaxNumBuffers = Adapter->NumBuffers > Adapter->NumTcb ? Adapter->NumBuffers: Adapter->NumTcb;
NdisAllocateBufferPool(
&Status,
&Adapter->SendBufferPool,
MaxNumBuffers);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_BUFFER_POOL;
DBGPRINT(MP_ERROR, ("Failed to allocate send buffer pool\n"));
break;
}
// Allocate send buffers
Adapter->MpTxBufMemSize = Adapter->NumBuffers * sizeof(MP_TXBUF);
Status = MP_ALLOCMEMTAG(&pMem, Adapter->MpTxBufMemSize);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_MEMORY;
DBGPRINT(MP_ERROR, ("Failed to allocate MP_TXBUF's\n"));
break;
}
NdisZeroMemory(pMem, Adapter->MpTxBufMemSize);
Adapter->MpTxBufMem = pMem;
pMpTxbuf = (PMP_TXBUF) pMem;
//
// NdisMGetDmaAlignment is provided in XP (WINVER=0x0501) and higher
// if you need to write a driver that runs on older versions of Windows
// you need to compile with older versions of DDK which have WINVER < 0x0501
// such as W2K DDK.
//
Adapter->CacheFillSize = NdisMGetDmaAlignment(Adapter->AdapterHandle);
DBGPRINT(MP_INFO, ("CacheFillSize=%d\n", Adapter->CacheFillSize));
for (index = 0; index < Adapter->NumBuffers; index++)
{
pMpTxbuf->AllocSize = NIC_MAX_PACKET_SIZE + Adapter->CacheFillSize;
pMpTxbuf->BufferSize = NIC_MAX_PACKET_SIZE;
NdisMAllocateSharedMemory(
Adapter->AdapterHandle,
pMpTxbuf->AllocSize,
TRUE, // CACHED
&pMpTxbuf->AllocVa,
&pMpTxbuf->AllocPa);
if (!pMpTxbuf->AllocVa)
{
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
DBGPRINT(MP_ERROR, ("Failed to allocate a big buffer\n"));
Status = NDIS_STATUS_RESOURCES;
break;
}
//
// Align the buffer on the cache line boundary
//
pMpTxbuf->pBuffer = MP_ALIGNMEM(pMpTxbuf->AllocVa, Adapter->CacheFillSize);
pMpTxbuf->BufferPa.QuadPart = MP_ALIGNMEM_PA(pMpTxbuf->AllocPa, Adapter->CacheFillSize);
NdisAllocateBuffer(
&Status,
&pMpTxbuf->NdisBuffer,
Adapter->SendBufferPool,
pMpTxbuf->pBuffer,
pMpTxbuf->BufferSize);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_NDIS_BUFFER;
DBGPRINT(MP_ERROR, ("Failed to allocate NDIS buffer for a big buffer\n"));
NdisMFreeSharedMemory(
Adapter->AdapterHandle,
pMpTxbuf->AllocSize,
TRUE, // CACHED
pMpTxbuf->AllocVa,
pMpTxbuf->AllocPa);
break;
}
PushEntryList(&Adapter->SendBufList, &pMpTxbuf->SList);
pMpTxbuf++;
}
if (Status != NDIS_STATUS_SUCCESS) break;
// HW_START
//
// Allocate shared memory for send
//
Adapter->HwSendMemAllocSize = Adapter->NumTcb * (sizeof(TXCB_STRUC) +
NIC_MAX_PHYS_BUF_COUNT * sizeof(TBD_STRUC));
NdisMAllocateSharedMemory(
Adapter->AdapterHandle,
Adapter->HwSendMemAllocSize,
FALSE,
(PVOID) &Adapter->HwSendMemAllocVa,
&Adapter->HwSendMemAllocPa);
if (!Adapter->HwSendMemAllocVa)
{
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
DBGPRINT(MP_ERROR, ("Failed to allocate send memory\n"));
Status = NDIS_STATUS_RESOURCES;
break;
}
NdisZeroMemory(Adapter->HwSendMemAllocVa, Adapter->HwSendMemAllocSize);
//
// Allocate shared memory for other uses
//
Adapter->HwMiscMemAllocSize =
sizeof(SELF_TEST_STRUC) + ALIGN_16 +
sizeof(DUMP_AREA_STRUC) + ALIGN_16 +
sizeof(NON_TRANSMIT_CB) + ALIGN_16 +
sizeof(ERR_COUNT_STRUC) + ALIGN_16;
//
// Allocate the shared memory for the command block data structures.
//
NdisMAllocateSharedMemory(
Adapter->AdapterHandle,
Adapter->HwMiscMemAllocSize,
FALSE,
(PVOID *) &Adapter->HwMiscMemAllocVa,
&Adapter->HwMiscMemAllocPa);
if (!Adapter->HwMiscMemAllocVa)
{
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
DBGPRINT(MP_ERROR, ("Failed to allocate misc memory\n"));
Status = NDIS_STATUS_RESOURCES;
break;
}
NdisZeroMemory(Adapter->HwMiscMemAllocVa, Adapter->HwMiscMemAllocSize);
pMem = Adapter->HwMiscMemAllocVa;
MemPhys = NdisGetPhysicalAddressLow(Adapter->HwMiscMemAllocPa);
Adapter->SelfTest = (PSELF_TEST_STRUC)MP_ALIGNMEM(pMem, ALIGN_16);
Adapter->SelfTestPhys = MP_ALIGNMEM_PHYS(MemPhys, ALIGN_16);
pMem = (PUCHAR)Adapter->SelfTest + sizeof(SELF_TEST_STRUC);
MemPhys = Adapter->SelfTestPhys + sizeof(SELF_TEST_STRUC);
Adapter->NonTxCmdBlock = (PNON_TRANSMIT_CB)MP_ALIGNMEM(pMem, ALIGN_16);
Adapter->NonTxCmdBlockPhys = MP_ALIGNMEM_PHYS(MemPhys, ALIGN_16);
pMem = (PUCHAR)Adapter->NonTxCmdBlock + sizeof(NON_TRANSMIT_CB);
MemPhys = Adapter->NonTxCmdBlockPhys + sizeof(NON_TRANSMIT_CB);
Adapter->DumpSpace = (PDUMP_AREA_STRUC)MP_ALIGNMEM(pMem, ALIGN_16);
Adapter->DumpSpacePhys = MP_ALIGNMEM_PHYS(MemPhys, ALIGN_16);
pMem = (PUCHAR)Adapter->DumpSpace + sizeof(DUMP_AREA_STRUC);
MemPhys = Adapter->DumpSpacePhys + sizeof(DUMP_AREA_STRUC);
Adapter->StatsCounters = (PERR_COUNT_STRUC)MP_ALIGNMEM(pMem, ALIGN_16);
Adapter->StatsCounterPhys = MP_ALIGNMEM_PHYS(MemPhys, ALIGN_16);
// HW_END
//
// Recv
//
NdisInitializeNPagedLookasideList(
&Adapter->RecvLookaside,
NULL,
NULL,
0,
sizeof(MP_RFD),
NIC_TAG,
0);
MP_SET_FLAG(Adapter, fMP_ADAPTER_RECV_LOOKASIDE);
// set the max number of RFDs
// disable the RFD grow/shrink scheme if user specifies a NumRfd value
// larger than NIC_MAX_GROW_RFDS
Adapter->MaxNumRfd = max(Adapter->NumRfd, NIC_MAX_GROW_RFDS);
DBGPRINT(MP_INFO, ("NumRfd = %d\n", Adapter->NumRfd));
DBGPRINT(MP_INFO, ("MaxNumRfd = %d\n", Adapter->MaxNumRfd));
//
// The driver should allocate more data than sizeof(RFD_STRUC) to allow the
// driver to align the data(after ethernet header) at 8 byte boundary
//
Adapter->HwRfdSize = sizeof(RFD_STRUC) + MORE_DATA_FOR_ALIGN;
// alloc the recv packet pool
NdisAllocatePacketPoolEx(
&Status,
&Adapter->RecvPacketPool,
Adapter->NumRfd,
Adapter->MaxNumRfd,
sizeof(PVOID) * 4);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_PACKET_POOL;
break;
}
// alloc the buffer pool
NdisAllocateBufferPool(
&Status,
&Adapter->RecvBufferPool,
Adapter->MaxNumRfd);
if (Status != NDIS_STATUS_SUCCESS)
{
ErrorValue = ERRLOG_OUT_OF_BUFFER_POOL;
break;
}
#if OFFLOAD
//
// Allocate the shared memory for the offloading packet
// this miniport use this shared memory when OFFLAOD is on
//
for (i = 0; i < LARGE_SEND_MEM_SIZE_OPTION; i++)
{
NdisMAllocateSharedMemory(
Adapter->AdapterHandle,
LargeSendSharedMemArray[i],
FALSE,
(PVOID *)&(Adapter->OffloadSharedMem.StartVa),
&(Adapter->OffloadSharedMem.PhyAddr));
if (Adapter->OffloadSharedMem.StartVa)
{
Adapter->OffloadSharedMemSize = LargeSendSharedMemArray[i];
OffloadSharedMemSuccess = TRUE;
Adapter->OffloadEnable = TRUE;
break;
}
}
//
// The driver cannot allocate the shared memory used by offload, but it should
// NOT fail the initialization
//
if (OffloadSharedMemSuccess == FALSE)
{
DBGPRINT(MP_ERROR, ("Failed to allocate offload used memory\n"));
Adapter->OffloadEnable = FALSE;
}
#endif
Status = NDIS_STATUS_SUCCESS;
} while (FALSE);
if (Status != NDIS_STATUS_SUCCESS)
{
NdisWriteErrorLogEntry(
Adapter->AdapterHandle,
NDIS_ERROR_CODE_OUT_OF_RESOURCES,
1,
ErrorValue);
}
DBGPRINT_S(Status, ("<-- NICAllocMemory, Status=%x\n", Status));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -