📄 mp_req.c
字号:
(UCHAR) (NewParameterField & (~CB_CFIG_CRS_OR_CDT));
}
//
// Setup Full duplex stuff
//
//
// If forced to half duplex
//
if (Adapter->AiForceDpx == 1)
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[19] =
(CB_557_CFIG_DEFAULT_PARM19 &
(~(CB_CFIG_FORCE_FDX| CB_CFIG_FDX_ENABLE)));
}
//
// If forced to full duplex
//
else if (Adapter->AiForceDpx == 2)
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[19] =
(CB_557_CFIG_DEFAULT_PARM19 | CB_CFIG_FORCE_FDX);
}
//
// If auto-duplex
//
else
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[19] =
CB_557_CFIG_DEFAULT_PARM19;
}
//
// if multicast all is being turned on, set the bit
//
if (PacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST)
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[21] =
(CB_557_CFIG_DEFAULT_PARM21 | CB_CFIG_MULTICAST_ALL);
}
else
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[21] =
CB_557_CFIG_DEFAULT_PARM21;
}
//
// Wait for the SCB to clear before we check the CU status.
//
if (!WaitScb(Adapter))
{
Status = NDIS_STATUS_HARD_ERRORS;
break;
}
//
// If we have issued any transmits, then the CU will either be active,
// or in the suspended state. If the CU is active, then we wait for
// it to be suspended.
//
if (Adapter->TransmitIdle == FALSE)
{
//
// Wait for suspended state
//
MP_STALL_AND_WAIT((Adapter->CSRAddress->ScbStatus & SCB_CUS_MASK) != SCB_CUS_ACTIVE, 5000, bResult);
if (!bResult)
{
MP_SET_HARDWARE_ERROR(Adapter);
Status = NDIS_STATUS_HARD_ERRORS;
break;
}
//
// Check the current status of the receive unit
//
if ((Adapter->CSRAddress->ScbStatus & SCB_RUS_MASK) != SCB_RUS_IDLE)
{
// Issue an RU abort. Since an interrupt will be issued, the
// RU will be started by the DPC.
Status = D100IssueScbCommand(Adapter, SCB_RUC_ABORT, TRUE);
if (Status != NDIS_STATUS_SUCCESS)
{
break;
}
}
if (!WaitScb(Adapter))
{
Status = NDIS_STATUS_HARD_ERRORS;
break;
}
//
// Restore the transmit software flags. After the multicast
// command is issued, the command unit will be idle, because the
// EL bit will be set in the multicast commmand block.
//
Adapter->TransmitIdle = TRUE;
Adapter->ResumeWait = TRUE;
}
//
// Display config info
//
DBGPRINT(MP_INFO, ("Re-Issuing Configure command for filter change\n"));
DBGPRINT(MP_INFO, ("Config Block at virt addr "PTR_FORMAT", phys address %x\n",
&((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbStatus, Adapter->NonTxCmdBlockPhys));
for (i = 0; i < CB_CFIG_BYTE_COUNT; i++)
DBGPRINT(MP_INFO, (" Config byte %x = %.2x\n", i, Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[i]));
//
// Submit the configure command to the chip, and wait for it to complete.
//
Adapter->CSRAddress->ScbGeneralPointer = Adapter->NonTxCmdBlockPhys;
Status = D100SubmitCommandBlockAndWait(Adapter);
if (Status != NDIS_STATUS_SUCCESS)
{
Status = NDIS_STATUS_NOT_ACCEPTED;
}
} while (FALSE);
DBGPRINT_S(Status, ("<-- NICSetPacketFilter, Status=%x\n", Status));
return(Status);
}
NDIS_STATUS NICSetMulticastList(
IN PMP_ADAPTER Adapter
)
/*++
Routine Description:
This routine will set up the adapter for a specified multicast address list
Arguments:
Adapter Pointer to our adapter
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_NOT_ACCEPTED
--*/
{
NDIS_STATUS Status;
PUCHAR McAddress;
UINT i, j;
BOOLEAN bResult;
DBGPRINT(MP_TRACE, ("--> NICSetMulticastList\n"));
//
// Setup the command block for the multicast command.
//
for (i = 0; i < Adapter->MCAddressCount; i++)
{
DBGPRINT(MP_INFO, ("MC(%d) = %02x-%02x-%02x-%02x-%02x-%02x\n",
i,
Adapter->MCList[i][0],
Adapter->MCList[i][1],
Adapter->MCList[i][2],
Adapter->MCList[i][3],
Adapter->MCList[i][4],
Adapter->MCList[i][5]));
McAddress = &Adapter->NonTxCmdBlock->NonTxCb.Multicast.McAddress[i*ETHERNET_ADDRESS_LENGTH];
for (j = 0; j < ETH_LENGTH_OF_ADDRESS; j++)
*(McAddress++) = Adapter->MCList[i][j];
}
Adapter->NonTxCmdBlock->NonTxCb.Multicast.McCount =
(USHORT)(Adapter->MCAddressCount * ETH_LENGTH_OF_ADDRESS);
((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbStatus = 0;
((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbCommand = CB_MULTICAST;
//
// Wait for the SCB to clear before we check the CU status.
//
if (!WaitScb(Adapter))
{
Status = NDIS_STATUS_HARD_ERRORS;
MP_EXIT;
}
//
// If we have issued any transmits, then the CU will either be active, or
// in the suspended state. If the CU is active, then we wait for it to be
// suspended.
//
if (Adapter->TransmitIdle == FALSE)
{
//
// Wait for suspended state
//
MP_STALL_AND_WAIT((Adapter->CSRAddress->ScbStatus & SCB_CUS_MASK) != SCB_CUS_ACTIVE, 5000, bResult);
if (!bResult)
{
MP_SET_HARDWARE_ERROR(Adapter);
Status = NDIS_STATUS_HARD_ERRORS;
}
//
// Restore the transmit software flags. After the multicast command is
// issued, the command unit will be idle, because the EL bit will be
// set in the multicast commmand block.
//
Adapter->TransmitIdle = TRUE;
Adapter->ResumeWait = TRUE;
}
//
// Update the command list pointer.
//
Adapter->CSRAddress->ScbGeneralPointer = Adapter->NonTxCmdBlockPhys;
//
// Submit the multicast command to the adapter and wait for it to complete.
//
Status = D100SubmitCommandBlockAndWait(Adapter);
if (Status != NDIS_STATUS_SUCCESS)
{
Status = NDIS_STATUS_NOT_ACCEPTED;
}
exit:
DBGPRINT_S(Status, ("<-- NICSetMulticastList, Status=%x\n", Status));
return(Status);
}
NDIS_STATUS MPSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
/*++
Routine Description:
This is the handler for an OID set operation.
The only operations that really change the configuration of the adapter are
set PACKET_FILTER, and SET_MULTICAST.
Arguments:
MiniportAdapterContext Pointer to the adapter structure
Oid Oid for this query
InformationBuffer Buffer for information
InformationBufferLength Size of this buffer
BytesRead Specifies how much info is read
BytesNeeded In case the buffer is smaller than what we need, tell them how much is needed
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_INVALID_LENGTH
NDIS_STATUS_INVALID_OID
NDIS_STATUS_NOT_SUPPORTED
NDIS_STATUS_NOT_ACCEPTED
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PMP_ADAPTER Adapter = (PMP_ADAPTER) MiniportAdapterContext;
ULONG PacketFilter;
NDIS_DEVICE_POWER_STATE NewPowerState;
ULONG CustomDriverSet;
#if OFFLOAD
PNDIS_TASK_OFFLOAD_HEADER pNdisTaskOffloadHdr;
PNDIS_TASK_OFFLOAD TaskOffload;
PNDIS_TASK_OFFLOAD TmpOffload;
PNDIS_TASK_TCP_IP_CHECKSUM pTcpIpChecksumTask;
PNDIS_TASK_TCP_LARGE_SEND pNdisTaskTcpLargeSend;
UINT i;
#endif
DBGPRINT(MP_TRACE, ("====> MPSetInformation\n"));
*BytesRead = 0;
*BytesNeeded = 0;
switch(Oid)
{
case OID_802_3_MULTICAST_LIST:
//
// Verify the length
//
if (InformationBufferLength % ETH_LENGTH_OF_ADDRESS != 0)
{
return(NDIS_STATUS_INVALID_LENGTH);
}
//
// Save the number of MC list size
//
Adapter->MCAddressCount = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;
ASSERT(Adapter->MCAddressCount <= NIC_MAX_MCAST_LIST);
//
// Save the MC list
//
NdisMoveMemory(
Adapter->MCList,
InformationBuffer,
InformationBufferLength);
*BytesRead = InformationBufferLength;
NdisDprAcquireSpinLock(&Adapter->Lock);
NdisDprAcquireSpinLock(&Adapter->RcvLock);
Status = NICSetMulticastList(Adapter);
NdisDprReleaseSpinLock(&Adapter->RcvLock);
NdisDprReleaseSpinLock(&Adapter->Lock);
break;
case OID_GEN_CURRENT_PACKET_FILTER:
//
// Verify the Length
//
if (InformationBufferLength != sizeof(ULONG))
{
return(NDIS_STATUS_INVALID_LENGTH);
}
*BytesRead = InformationBufferLength;
NdisMoveMemory(&PacketFilter, InformationBuffer, sizeof(ULONG));
//
// any bits not supported?
//
if (PacketFilter & ~NIC_SUPPORTED_FILTERS)
{
return(NDIS_STATUS_NOT_SUPPORTED);
}
//
// any filtering changes?
//
if (PacketFilter == Adapter->PacketFilter)
{
return(NDIS_STATUS_SUCCESS);
}
NdisDprAcquireSpinLock(&Adapter->Lock);
NdisDprAcquireSpinLock(&Adapter->RcvLock);
if (MP_TEST_FLAG(Adapter, fMP_ADAPTER_LINK_DETECTION))
{
ASSERT(!Adapter->bSetPending);
Adapter->bSetPending = TRUE;
Adapter->SetRequest.Oid = Oid;
Adapter->SetRequest.InformationBuffer = InformationBuffer;
Adapter->SetRequest.InformationBufferLength = InformationBufferLength;
Adapter->SetRequest.BytesRead = BytesRead;
Adapter->SetRequest.BytesNeeded = BytesNeeded;
NdisDprReleaseSpinLock(&Adapter->RcvLock);
NdisDprReleaseSpinLock(&Adapter->Lock);
Status = NDIS_STATUS_PENDING;
break;
}
Status = NICSetPacketFilter(
Adapter,
PacketFilter);
NdisDprReleaseSpinLock(&Adapter->RcvLock);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -