Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
_write.c
Abstract:
This is the main file for the AsyncMAC Driver for the Remote Access Service. This driver conforms to the NDIS 3.0 interface.
Author:
Thomas J. Dimitri (TommyD) 08-May-1992
Environment:
Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
Revision History:
Ray Patch (raypa) 04/13/94 Modified for new WAN wrapper.
--*/
#define RAISEIRQL
#include "asyncall.h"
#if DBG
ULONG UlFramesOut = 0; #endif
// asyncmac.c will define the global parameters.
ULONG GlobalXmitCameBack = 0; ULONG GlobalXmitCameBack2 = 0; ULONG GlobalXmitCameBack3 = 0;
//
// The assemble frame routine is specific for RAS 1.0 and 2.0
// frame formats. It uses a 16 byte CRC at the end.
//
VOID AsyncFrameRASXonXoff( PUCHAR pStartOfFrame, postamble *pPostamble, PASYNC_FRAME pFrame, UCHAR controlCastByte);
VOID AsyncFrameRASNormal( PUCHAR pStartOfFrame, postamble *pPostamble, PASYNC_FRAME pFrame, UCHAR controlCastByte);
NTSTATUS AsyncWriteCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, //... Our device object.
IN PIRP Irp, //... I/O request packet.
IN PNDIS_WAN_PACKET WanPacket //... Completion context.
)
/*++
This is the IO Completion routine for WriteFrame.
It is called when an I/O Write request has completed.
--*/ { NTSTATUS Status; NTSTATUS PacketStatus; PASYNC_INFO AsyncInfo;
//
// Make the compiler happy.
//
UNREFERENCED_PARAMETER(DeviceObject);
//
// Initialize locals.
//
AsyncInfo = WanPacket->MacReserved1;
PacketStatus = NDIS_STATUS_FAILURE;
Status = Irp->IoStatus.Status;
//
// Free the irp used to send the packt to the serial driver
//
IoFreeIrp(Irp);
//
// What was the outcome of the IRP.
//
switch ( Status ) {
case STATUS_SUCCESS: PacketStatus = NDIS_STATUS_SUCCESS; break;
case STATUS_TIMEOUT: DbgTracef(-2,("ASYNC: Status TIMEOUT on write\n")); break;
case STATUS_CANCELLED: DbgTracef(-2,("ASYNC: Status CANCELLED on write\n")); break;
case STATUS_PENDING: DbgTracef(0,("ASYNC: Status PENDING on write\n")); break;
default: DbgTracef(-2,("ASYNC: Unknown status 0x%.8x on write", Status)); break;
}
//
// Count this packet completion.
//
AsyncInfo->Out++;
//
// Tell the Wrapper that we have finally the packet has been sent
//
NdisMWanSendComplete( AsyncInfo->Adapter->MiniportHandle, WanPacket, PacketStatus);
//
// We return STATUS_MORE_PROCESSING_REQUIRED so that the
// IoCompletionRoutine will stop working on the IRP.
//
return STATUS_MORE_PROCESSING_REQUIRED; }
NTSTATUS AsyncGetFrameFromPool( IN PASYNC_INFO Info, OUT PASYNC_FRAME *NewFrame )
/*++
--*/ { PASYNC_ADAPTER Adapter=Info->Adapter; PASYNC_FRAME pFrame;
pFrame = (ASYNC_FRAME*) ExAllocateFromNPagedLookasideList(&Adapter->AsyncFrameList);
if (pFrame == NULL) { *NewFrame = NULL; return NDIS_STATUS_RESOURCES; }
//
// increase by 16 for frame runover padding when we have to resync
//
pFrame->Frame = (PUCHAR)pFrame + sizeof(ASYNC_FRAME) + sizeof(PVOID); (ULONG_PTR)pFrame->Frame &= ~((ULONG_PTR)(sizeof(PVOID)-1));
pFrame->FrameLength = Adapter->MaxFrameSize;
// assign back ptr from frame to adapter
pFrame->Adapter=Adapter;
// setup another back ptr
pFrame->Info=Info;
*NewFrame = pFrame;
return(NDIS_STATUS_SUCCESS); }
|