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.
164 lines
2.8 KiB
164 lines
2.8 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
_read.c
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
Thomas J. Dimitri (TommyD) 08-May-1992
|
|
|
|
Environment:
|
|
|
|
Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
#include "asyncall.h"
|
|
|
|
#define RAISEIRQL
|
|
|
|
#if DBG
|
|
ULONG UlFramesUp = 0;
|
|
#endif
|
|
|
|
|
|
#ifdef LALALA
|
|
PVOID CurrentWatchPoint=0;
|
|
|
|
static
|
|
VOID
|
|
AsyncSetBreakPoint(
|
|
PVOID LinearAddress) {
|
|
|
|
ASSERT(CurrentWatchPoint == 0);
|
|
CurrentWatchPoint = LinearAddress;
|
|
|
|
_asm {
|
|
mov eax, LinearAddress
|
|
mov dr0, eax
|
|
mov eax, dr7
|
|
or eax, 10303h
|
|
mov dr7, eax
|
|
}
|
|
}
|
|
|
|
|
|
static
|
|
VOID
|
|
AsyncRemoveBreakPoint(
|
|
PVOID LinearAddress) {
|
|
|
|
ASSERT(CurrentWatchPoint == LinearAddress);
|
|
CurrentWatchPoint = 0;
|
|
|
|
_asm {
|
|
|
|
mov eax, dr7
|
|
mov ebx, 10003h
|
|
not ebx
|
|
and eax, ebx
|
|
mov dr7, eax
|
|
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// the function below is called by an executive worker thread
|
|
// to start reading frames.
|
|
|
|
NTSTATUS
|
|
AsyncStartReads(
|
|
PASYNC_INFO pInfo
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
UCHAR eventChar;
|
|
|
|
//
|
|
// Initialize locals.
|
|
//
|
|
|
|
//
|
|
// assign back ptr from frame to adapter
|
|
//
|
|
|
|
pInfo->AsyncFrame->Adapter = pInfo->Adapter;
|
|
|
|
//
|
|
// assign other back ptr
|
|
//
|
|
|
|
pInfo->AsyncFrame->Info = pInfo;
|
|
|
|
//
|
|
// set baud rate and timeouts
|
|
// we use a linkspeed of 0 to indicate
|
|
// no read interval timeout
|
|
//
|
|
|
|
SetSerialStuff(NULL, pInfo, 0);
|
|
|
|
eventChar = PPP_FLAG_BYTE;
|
|
|
|
if (pInfo->GetLinkInfo.RecvFramingBits & SLIP_FRAMING) {
|
|
|
|
eventChar = SLIP_END_BYTE;
|
|
}
|
|
|
|
SerialSetEventChar(pInfo, eventChar);
|
|
|
|
//
|
|
// We will wait on whenever we get the special PPP flag byte
|
|
// or whenever we get RLSD or DSR changes (for possible hang-up
|
|
// cases) or when the receive buffer is getting full.
|
|
//
|
|
|
|
SerialSetWaitMask(pInfo, pInfo->WaitMaskToUse) ;
|
|
|
|
//
|
|
// For SLIP and PPP reads we use the AsyncPPPRead routine.
|
|
//
|
|
AsyncPPPRead(pInfo);
|
|
|
|
return NDIS_STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
VOID
|
|
AsyncIndicateFragment(
|
|
IN PASYNC_INFO pInfo,
|
|
IN ULONG Error)
|
|
{
|
|
|
|
PASYNC_ADAPTER pAdapter=pInfo->Adapter;
|
|
NDIS_MAC_FRAGMENT AsyncFragment;
|
|
|
|
AsyncFragment.NdisLinkContext = pInfo->NdisLinkContext;
|
|
AsyncFragment.Errors = Error;
|
|
|
|
|
|
//
|
|
// Tell the transport above (or really RasHub) that a frame
|
|
// was just dropped. Give the endpoint when doing so.
|
|
//
|
|
NdisMIndicateStatus(
|
|
pAdapter->MiniportHandle,
|
|
NDIS_STATUS_WAN_FRAGMENT, // General Status
|
|
&AsyncFragment, // Specific Status (address)
|
|
sizeof(NDIS_MAC_FRAGMENT));
|
|
|
|
}
|