📄 mp_init.c
字号:
{
DBGPRINT(MP_ERROR, ("Failed to allocate memory - ADAPTER\n"));
break;
}
// Clean up the memory block
NdisZeroMemory(Adapter, sizeof(MP_ADAPTER));
MP_INC_REF(Adapter);
// Init lists, spinlocks, etc.
InitializeQueueHeader(&Adapter->SendWaitQueue);
InitializeQueueHeader(&Adapter->SendCancelQueue);
InitializeListHead(&Adapter->RecvList);
InitializeListHead(&Adapter->RecvPendList);
InitializeListHead(&Adapter->PoMgmt.PatternList);
NdisInitializeEvent(&Adapter->ExitEvent);
NdisInitializeEvent(&Adapter->AllPacketsReturnedEvent);
MP_INC_RCV_REF(Adapter);
NdisAllocateSpinLock(&Adapter->Lock);
NdisAllocateSpinLock(&Adapter->SendLock);
NdisAllocateSpinLock(&Adapter->RcvLock);
} while (FALSE);
*pAdapter = Adapter;
DBGPRINT_S(Status, ("<-- NICAllocAdapter, Status=%x\n", Status));
return Status;
}
VOID MpFreeAdapter(
IN PMP_ADAPTER Adapter)
/*++
Routine Description:
Free all the resources and MP_ADAPTER data block
Arguments:
Adapter Pointer to our adapter
Return Value:
None
--*/
{
PMP_TXBUF pMpTxBuf;
PMP_RFD pMpRfd;
DBGPRINT(MP_TRACE, ("--> NICFreeAdapter\n"));
// No active and waiting sends
ASSERT(Adapter->nBusySend == 0);
ASSERT(Adapter->nWaitSend == 0);
ASSERT(IsQueueEmpty(&Adapter->SendWaitQueue));
ASSERT(IsQueueEmpty(&Adapter->SendCancelQueue));
// No other pending operations
ASSERT(IsListEmpty(&Adapter->RecvPendList));
ASSERT(Adapter->bAllocNewRfd == FALSE);
ASSERT(!MP_TEST_FLAG(Adapter, fMP_ADAPTER_LINK_DETECTION));
ASSERT(MP_GET_REF(Adapter) == 0);
//
// Free hardware resources
//
if (MP_TEST_FLAG(Adapter, fMP_ADAPTER_INTERRUPT_IN_USE))
{
NdisMDeregisterInterrupt(&Adapter->Interrupt);
MP_CLEAR_FLAG(Adapter, fMP_ADAPTER_INTERRUPT_IN_USE);
}
if (Adapter->CSRAddress)
{
NdisMUnmapIoSpace(
Adapter->AdapterHandle,
Adapter->CSRAddress,
NIC_MAP_IOSPACE_LENGTH);
Adapter->CSRAddress = NULL;
}
if (Adapter->PortOffset)
{
NdisMDeregisterIoPortRange(
Adapter->AdapterHandle,
Adapter->IoBaseAddress,
Adapter->IoRange,
Adapter->PortOffset);
Adapter->PortOffset = NULL;
}
//
// Free RECV memory/NDIS buffer/NDIS packets/shared memory
//
ASSERT(Adapter->nReadyRecv == Adapter->CurrNumRfd);
while (!IsListEmpty(&Adapter->RecvList))
{
pMpRfd = (PMP_RFD)RemoveHeadList(&Adapter->RecvList);
NICFreeRfd(Adapter, pMpRfd);
}
// Free receive buffer pool
if (Adapter->RecvBufferPool)
{
NdisFreeBufferPool(Adapter->RecvBufferPool);
Adapter->RecvBufferPool = NULL;
}
// Free receive packet pool
if (Adapter->RecvPacketPool)
{
NdisFreePacketPool(Adapter->RecvPacketPool);
Adapter->RecvPacketPool = NULL;
}
if (MP_TEST_FLAG(Adapter, fMP_ADAPTER_RECV_LOOKASIDE))
{
NdisDeleteNPagedLookasideList(&Adapter->RecvLookaside);
MP_CLEAR_FLAG(Adapter, fMP_ADAPTER_RECV_LOOKASIDE);
}
//
// Free SEND memory/NDIS buffer/NDIS packets/shared memory
//
while (!IsSListEmpty(&Adapter->SendBufList))
{
pMpTxBuf = (PMP_TXBUF)PopEntryList(&Adapter->SendBufList);
ASSERT(pMpTxBuf);
// Free the shared memory associated with each MP_TXBUF
if (pMpTxBuf->AllocVa)
{
NdisMFreeSharedMemory(
Adapter->AdapterHandle,
pMpTxBuf->AllocSize,
TRUE,
pMpTxBuf->AllocVa,
pMpTxBuf->AllocPa);
pMpTxBuf->AllocVa = NULL;
}
// Free the NDIS buffer
if (pMpTxBuf->NdisBuffer)
{
NdisAdjustBufferLength(pMpTxBuf->NdisBuffer, pMpTxBuf->BufferSize);
NdisFreeBuffer(pMpTxBuf->NdisBuffer);
pMpTxBuf->NdisBuffer = NULL;
}
}
// Free the send buffer pool
if (Adapter->SendBufferPool)
{
NdisFreeBufferPool(Adapter->SendBufferPool);
Adapter->SendBufferPool = NULL;
}
// Free the memory for MP_TXBUF structures
if (Adapter->MpTxBufMem)
{
MP_FREEMEM(Adapter->MpTxBufMem, Adapter->MpTxBufMemSize, 0);
Adapter->MpTxBufMem = NULL;
}
// Free the shared memory for HW_TCB structures
if (Adapter->HwSendMemAllocVa)
{
NdisMFreeSharedMemory(
Adapter->AdapterHandle,
Adapter->HwSendMemAllocSize,
FALSE,
Adapter->HwSendMemAllocVa,
Adapter->HwSendMemAllocPa);
Adapter->HwSendMemAllocVa = NULL;
}
// Free the shared memory for other command data structures
if (Adapter->HwMiscMemAllocVa)
{
NdisMFreeSharedMemory(
Adapter->AdapterHandle,
Adapter->HwMiscMemAllocSize,
FALSE,
Adapter->HwMiscMemAllocVa,
Adapter->HwMiscMemAllocPa);
Adapter->HwMiscMemAllocVa = NULL;
}
// Free the memory for MP_TCB structures
if (Adapter->MpTcbMem)
{
MP_FREEMEM(Adapter->MpTcbMem, Adapter->MpTcbMemSize, 0);
Adapter->MpTcbMem = NULL;
}
#if OFFLOAD
// Free the shared memory for offload tasks
if (Adapter->OffloadSharedMem.StartVa)
{
NdisMFreeSharedMemory(
Adapter->AdapterHandle,
Adapter->OffloadSharedMemSize,
FALSE,
Adapter->OffloadSharedMem.StartVa,
Adapter->OffloadSharedMem.PhyAddr);
Adapter->OffloadSharedMem.StartVa = NULL;
}
#endif
//Free all the wake up patterns on this adapter
MPRemoveAllWakeUpPatterns(Adapter);
NdisFreeSpinLock(&Adapter->Lock);
NdisFreeSpinLock(&Adapter->SendLock);
NdisFreeSpinLock(&Adapter->RcvLock);
#if LBFO
if (Adapter->BundleId.MaximumLength)
{
MP_FREE_NDIS_STRING(&Adapter->BundleId);
}
#endif
MP_FREEMEM(Adapter, sizeof(MP_ADAPTER), 0);
#if DBG
if (MPInitDone)
{
NdisFreeSpinLock(&MPMemoryLock);
}
#endif
DBGPRINT(MP_TRACE, ("<-- NICFreeAdapter\n"));
}
NDIS_STATUS NICReadRegParameters(
IN PMP_ADAPTER Adapter,
IN NDIS_HANDLE WrapperConfigurationContext)
/*++
Routine Description:
Read the following from the registry
1. All the parameters
2. NetworkAddres
3. LBFO - BundleId
Arguments:
Adapter Pointer to our adapter
WrapperConfigurationContext For use by NdisOpenConfiguration
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_FAILURE
NDIS_STATUS_RESOURCES
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
NDIS_HANDLE ConfigurationHandle;
PMP_REG_ENTRY pRegEntry;
UINT i;
UINT value;
PUCHAR pointer;
PNDIS_CONFIGURATION_PARAMETER ReturnedValue;
PUCHAR NetworkAddress;
UINT Length;
DBGPRINT(MP_TRACE, ("--> NICReadRegParameters\n"));
// Open the registry for this adapter
NdisOpenConfiguration(
&Status,
&ConfigurationHandle,
WrapperConfigurationContext);
if (Status != NDIS_STATUS_SUCCESS)
{
DBGPRINT(MP_ERROR, ("NdisOpenConfiguration failed\n"));
DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
return Status;
}
// read all the registry values
for (i = 0, pRegEntry = NICRegTable; i < NIC_NUM_REG_PARAMS; i++, pRegEntry++)
{
//
// Driver should NOT fail the initialization only because it can not
// read the registry
//
ASSERT(pRegEntry->bRequired == FALSE);
pointer = (PUCHAR) Adapter + pRegEntry->FieldOffset;
DBGPRINT_UNICODE(MP_INFO, &pRegEntry->RegName);
// Get the configuration value for a specific parameter. Under NT the
// parameters are all read in as DWORDs.
NdisReadConfiguration(
&Status,
&ReturnedValue,
ConfigurationHandle,
&pRegEntry->RegName,
NdisParameterInteger);
// If the parameter was present, then check its value for validity.
if (Status == NDIS_STATUS_SUCCESS)
{
// Check that param value is not too small or too large
if (ReturnedValue->ParameterData.IntegerData < pRegEntry->Min ||
ReturnedValue->ParameterData.IntegerData > pRegEntry->Max)
{
value = pRegEntry->Default;
}
else
{
value = ReturnedValue->ParameterData.IntegerData;
}
DBGPRINT_RAW(MP_INFO, ("= 0x%x\n", value));
}
else if (pRegEntry->bRequired)
{
DBGPRINT_RAW(MP_ERROR, (" -- failed\n"));
ASSERT(FALSE);
Status = NDIS_STATUS_FAILURE;
break;
}
else
{
value = pRegEntry->Default;
DBGPRINT_RAW(MP_INFO, ("= 0x%x (default)\n", value));
Status = NDIS_STATUS_SUCCESS;
}
//
// Store the value in the adapter structure.
//
switch(pRegEntry->FieldSize)
{
case 1:
*((PUCHAR) pointer) = (UCHAR) value;
break;
case 2:
*((PUSHORT) pointer) = (USHORT) value;
break;
case 4:
*((PULONG) pointer) = (ULONG) value;
break;
default:
DBGPRINT(MP_ERROR, ("Bogus field size %d\n", pRegEntry->FieldSize));
break;
}
}
// Read NetworkAddress registry value
// Use it as the current address if any
if (Status == NDIS_STATUS_SUCCESS)
{
NdisReadNetworkAddress(
&Status,
&NetworkAddress,
&Length,
ConfigurationHandle);
// If there is a NetworkAddress override in registry, use it
if ((Status == NDIS_STATUS_SUCCESS) && (Length == ETH_LENGTH_OF_ADDRESS))
{
if ((ETH_IS_MULTICAST(NetworkAddress)
|| ETH_IS_BROADCAST(NetworkAddress))
|| !ETH_IS_LOCALLY_ADMINISTERED (NetworkAddress))
{
DBGPRINT(MP_ERROR,
("Overriding NetworkAddress is invalid - %02x-%02x-%02x-%02x-%02x-%02x\n",
NetworkAddress[0], NetworkAddress[1], NetworkAddress[2],
NetworkAddress[3], NetworkAddress[4], NetworkAddress[5]));
}
else
{
ETH_COPY_NETWORK_ADDRESS(Adapter->CurrentAddress, NetworkAddress);
Adapter->bOverrideAddress = TRUE;
}
}
Status = NDIS_STATUS_SUCCESS;
}
#if LBFO
if (Status == NDIS_STATUS_SUCCESS)
{
// Read BundleIdentifier string
NdisReadConfiguration(
&Status,
&ReturnedValue,
ConfigurationHandle,
&strBundleId,
NdisParameterString);
if (Status == NDIS_STATUS_SUCCESS)
{
ASSERT(ReturnedValue->ParameterType == NdisParameterString);
if (ReturnedValue->ParameterData.StringData.Length !=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -