195 lines
3.8 KiB
C
195 lines
3.8 KiB
C
/*++
|
|
|
|
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);
|
|
}
|