⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 card.c

📁 Axis ax88172 USB 界面网卡驱动源代码
💻 C
📖 第 1 页 / 共 2 页
字号:


	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 + -