📄 card.c
字号:
if ( USBD_CANCEL(pUrb->UrbHeader.Status) )
return STATUS_MORE_PROCESSING_REQUIRED;
Adapter = context->Adapter;
if ( USBD_HALTED(pUrb->UrbHeader.Status) )
Adapter->HaltEvents |= HaltInterrupt;
else
{
if ( USBD_SUCCESS(pUrb->UrbHeader.Status) )
{
BOOLEAN fgMediaLinkUp;
if ( Adapter->InterruptBuffer[2] & ((Adapter->PhoneNetworkMedia)? 2:1) )
fgMediaLinkUp = TRUE;
else
fgMediaLinkUp = FALSE;
if ( fgMediaLinkUp != Adapter->fgMediaLinkUp )
{
Adapter->fgMediaLinkUp = fgMediaLinkUp;
NdisMIndicateStatus(
Adapter->MiniportAdapterHandle,
(fgMediaLinkUp)?
NDIS_STATUS_MEDIA_CONNECT :
NDIS_STATUS_MEDIA_DISCONNECT,
NULL,
0
);
if ( fgMediaLinkUp )
{
NdisMIndicateStatus(
Adapter->MiniportAdapterHandle,
NDIS_STATUS_LINK_SPEED_CHANGE,
NULL,
0
);
}
else
NdisMSetTimer( &Adapter->InterruptTimer,160 );
NdisMIndicateStatusComplete(
Adapter->MiniportAdapterHandle
);
}
else
{
NdisMSetTimer( &Adapter->InterruptTimer,160 );
}
}
else
{
NdisMSetTimer( &Adapter->InterruptTimer,160 );
}
}
return STATUS_MORE_PROCESSING_REQUIRED;
}
VOID
BulkUsb_InterruptEvent(
IN PAX_ADAPTER Adapter
)
//*++
//
//Routine Description:
// Breaks up a write in to specified sized chunks,
// as specified by deviceExtension->MaximumTransferSize
//
//Arguments:
// Adapter - pointer to the adapter block
//
//--*
{
PBULKUSB_RW_CONTEXT context = &Adapter->PendingInterrupt;
PIO_STACK_LOCATION nextStack;
UsbBuildInterruptOrBulkTransferRequest(
context->pUrb,
sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
Adapter->InterruptPipe,
&Adapter->InterruptBuffer[0],
NULL,
InterruptBufferSize,
(USBD_TRANSFER_DIRECTION_IN |USBD_SHORT_TRANSFER_OK), // Read
NULL
);
IoSetCompletionRoutine(
context->irp,
BulkUsb_Interrupt_Complete,
context,
TRUE,TRUE,FALSE
);
nextStack = IoGetNextIrpStackLocation(context->irp);
nextStack->Parameters.Others.Argument1 = context->pUrb;
nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
nextStack->Parameters.DeviceIoControl.IoControlCode =
IOCTL_INTERNAL_USB_SUBMIT_URB;
//
// Call the class driver to perform the operation.
if ( !NT_SUCCESS(IoCallDriver(Adapter->PhysicalDeviceObject,context->irp)) )
{
NdisMSetTimer( &Adapter->InterruptTimer,160 );
}
}
VOID
CardStart(
IN PAX_ADAPTER Adapter
)
//
//++
//
// Routine Description:
// Starts the card.
//
// Arguments:
// Adapter - pointer to the adapter block
//
//--
{
if ( !Adapter->fgReady )
{
URB Urb;
UINT i;
//
// Initialize the IRPs.
Adapter->PendingInterrupt.pUrb =
ExAllocatePool( NonPagedPool,sizeof(URB) );
Adapter->PendingInterrupt.irp =
IoAllocateIrp(
(CCHAR)(Adapter->PhysicalDeviceObject->StackSize + 1),
FALSE
);
NdisMSetTimer( &Adapter->InterruptTimer,3200 );
Adapter->PendingReceive.irp =
IoAllocateIrp(
(CCHAR)(Adapter->PhysicalDeviceObject->StackSize + 1),
FALSE
);
Adapter->PendingReceive.pUrb =
ExAllocatePool( NonPagedPool,sizeof(URB) );
Adapter->ReceiveBuffer[0] =
(PUCHAR)ExAllocatePool( NonPagedPool,(numReceiveQ*+numTransmitQ)*1514 );
for ( i=1; i <numReceiveQ; i++ )
Adapter->ReceiveBuffer[i] = Adapter->ReceiveBuffer[i-1]+1514;
Adapter->PacketFilter |= 0x80; //Alternate Setting!
UsbBuildVendorRequest(
&Urb,
URB_FUNCTION_VENDOR_DEVICE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_OUT,
0,
0x10,
Adapter->PacketFilter,
0,
NULL,
NULL,
0,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
Adapter->PendingTransmit.irp =
IoAllocateIrp(
(CCHAR)(Adapter->PhysicalDeviceObject->StackSize + 1),
FALSE
);
Adapter->PendingTransmit.pUrb =
ExAllocatePool( NonPagedPool,sizeof(URB) );
Adapter->TransmitBuffer[0] = Adapter->ReceiveBuffer[numReceiveQ-1]+1514;
for ( i=1; i <numTransmitQ; i++ )
Adapter->TransmitBuffer[i] = Adapter->TransmitBuffer[i-1]+1514;
Adapter->HaltEvents = 0;
Adapter->FirstReceive =
Adapter->LastReceive =
Adapter->FirstTransmit =
Adapter->LastTransmit = 0;
Adapter->fgReady = TRUE;
}
NdisMSetTimer( &Adapter->ReceiveTimer,1000 );
if ( Adapter->FirstPacket )
AX88172DoNextSend(Adapter);
}
VOID
CardStop(
IN PAX_ADAPTER Adapter
)
{
BOOLEAN Cancelled;
KIRQL Irql;
UINT i;
if ( !Adapter->fgReady )
return;
Adapter->fgReady = FALSE;
NdisMCancelTimer( &Adapter->TransmitHandleTimer,&Cancelled );
NdisMCancelTimer( &Adapter->TransmitTimer,&Cancelled );
NdisMCancelTimer( &Adapter->ReceiveHandleTimer,&Cancelled );
NdisMCancelTimer( &Adapter->ReceiveTimer,&Cancelled );
NdisMCancelTimer( &Adapter->InterruptTimer,&Cancelled );
if ( !Adapter->HaltEvents )
{
URB Urb;
if ( Adapter->uRemoteWakeup )
{
UsbBuildFeatureRequest(
&Urb,
URB_FUNCTION_SET_FEATURE_TO_DEVICE,
1,
0,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
UsbBuildVendorRequest(
&Urb,
URB_FUNCTION_VENDOR_DEVICE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_OUT,
0,
0x1d,
(Adapter->fgMediaLinkUp)? Adapter->uRemoteWakeup:2,
0,
NULL,
NULL,
0,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
}
else
{
USHORT uPhyRegister;
//Disable MII operation of AX88172 Hardware
UsbBuildVendorRequest(
&Urb,
URB_FUNCTION_VENDOR_DEVICE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_OUT,
0,
6,
0,
0,
NULL,
NULL,
0,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
uPhyRegister = 0;
while ( ~uPhyRegister&1 )
{
NdisStallExecution(50);
//Read MII Occupation Status
UsbBuildVendorRequest(
&Urb,
URB_FUNCTION_VENDOR_DEVICE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_IN |USBD_SHORT_TRANSFER_OK,
0,
9,
0,
0,
&uPhyRegister,
NULL,
1,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
}
if ( Adapter->PhoneNetworkMedia )
{
_MiiWriteRegister(
Adapter,
PhyControlReg,
MiiPhyCtrlIsolate|MiiPhyCtrlPowerDown
);
}
else
{
MiiWriteRegister(
Adapter,
&Urb,
Adapter->PrimaryPhy,
PhyControlReg,
MiiPhyCtrlIsolate|MiiPhyCtrlPowerDown
);
}
}
Adapter->PacketFilter &= ~0x80; //Alternate Setting!
UsbBuildVendorRequest(
&Urb,
URB_FUNCTION_VENDOR_DEVICE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_OUT,
0,
0x10,
Adapter->PacketFilter,
0,
NULL,
NULL,
0,
NULL
);
BulkUsb_CallUSBD(Adapter, &Urb);
}
//
// Start Polling Transmit/Receive/Interrupt Endpoint
if ( Adapter->PendingTransmit.irp->IoStatus.Status == STATUS_PENDING )
{
IoAcquireCancelSpinLock( &Irql );
IoCancelIrp( Adapter->PendingTransmit.irp );
IoReleaseCancelSpinLock( Irql );
while( Adapter->PendingTransmit.irp->IoStatus.Status == STATUS_PENDING )
NdisStallExecution(100);
}
IoFreeIrp( Adapter->PendingTransmit.irp );
ExFreePool( Adapter->PendingTransmit.pUrb );
if ( Adapter->PendingInterrupt.irp->IoStatus.Status == STATUS_PENDING )
{
IoAcquireCancelSpinLock( &Irql );
IoCancelIrp( Adapter->PendingInterrupt.irp );
IoReleaseCancelSpinLock( Irql );
while( Adapter->PendingInterrupt.irp->IoStatus.Status == STATUS_PENDING )
NdisStallExecution(100);
}
IoFreeIrp( Adapter->PendingInterrupt.irp );
ExFreePool( Adapter->PendingInterrupt.pUrb );
Adapter->PendingInterrupt.irp = NULL;
if ( Adapter->PendingReceive.irp->IoStatus.Status == STATUS_PENDING )
{
IoAcquireCancelSpinLock( &Irql );
IoCancelIrp( Adapter->PendingReceive.irp );
IoReleaseCancelSpinLock( Irql );
while( Adapter->PendingReceive.irp->IoStatus.Status == STATUS_PENDING )
NdisStallExecution(100);
}
IoFreeIrp( Adapter->PendingReceive.irp );
ExFreePool( Adapter->PendingReceive.pUrb );
ExFreePool( Adapter->ReceiveBuffer[0] );
while ( Adapter->FirstPacket )
{
PNDIS_PACKET Packet = Adapter->FirstPacket;
Adapter->FirstPacket = RESERVED(Packet)->Next;
NdisMSendComplete(
Adapter->MiniportAdapterHandle,
Packet,
NDIS_STATUS_SUCCESS
);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -