/*++
*******************************************************************************
* Copyright (c) 1990-98 Digi International Inc., All Rights Reserved				*
* 																										*
* This software contains proprietary and confidential information of Digi		*
* International Inc.  By accepting transfer of this copy, Recipient agrees		*
* to retain this software in confidence, to prevent disclosure to others,		*
* and to make no use of this software other than that for which it was			*
* delivered.  This is an unpublished copyrighted work of Digi International	*
* Inc.  Except as permitted by federal law, 17 USC 117, copying is strictly	*
* prohibited.																						*
* 																										*
* Restricted Rights Legend																		*
*																										*
* Use, duplication, or disclosure by the Government is subject to					*
* restrictions set forth in sub-paragraph (c)(1)(ii) of The Rights in			*
* Technical Data and Computer Software clause at DFARS 252.227-7031 or			*
* subparagraphs (c)(1) and (2) of the Commercial Computer Software -				*
* Restricted Rights at 48 CFR 52.227-19, as applicable.								*
*																										*
* Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343				*
*																										*
*******************************************************************************

Module Name:

   dxbqueue.h

Abstract:

   DXB adapter command and event queue management routines.

Author:

   Michael Zarns

--*/

#ifndef _DXBQUEUE_
#define _DXBQUEUE_

__inline ULONG_PTR dxbAlign32( ULONG_PTR Offset )
{
	return ( Offset + 3 ) & ~3;
}

__inline ULONG_PTR dxbAlign16( ULONG_PTR Offset )
{
	return ( Offset + 1 ) & ~1;
}

__inline ULONG dxbQueueNormalize( PDXB_MESSAGE_QUEUE pDesc, ULONG Offset )
{
	return Offset % pDesc->cbTotal;
}


ULONG dxbQueueReadBlock( PDXB_DEVICE_EXTENSION pExt,
                         PDXB_MESSAGE_QUEUE    pDesc,
                         PUCHAR                pBuf, 
                         ULONG                 QOffset,
                         ULONG                 cbRead,
                         BOOLEAN               fWrap,
                         BOOLEAN               fPad );

ULONG __inline dxbEventQueueRead( PDXB_DEVICE_EXTENSION pExt,
                                  ULONG                 QOffset,
                                  PVOID                 pBuf, 
                                  ULONG                 cbRead,
                                  BOOLEAN               fWrap,
                                  BOOLEAN               fPad )
{
	return dxbQueueReadBlock( pExt, &pExt->DxbEventQ, pBuf, QOffset, cbRead, fWrap, fPad );
}

NTSTATUS dxbQueueWriteCommand( IN PDXB_DEVICE_EXTENSION pExt,
                               IN PVOID                 pHeader,
                               IN ULONG                 cbHeader,
                               IN PVOID                 pControl,
                               IN ULONG                 cbControl,
                               IN PVOID                 pData,
                               IN ULONG                 cbData,
                               IN BOOLEAN               fWrapHdr,
                               IN BOOLEAN               fAlignData );

VOID dxbQueueInitAccessMethods( PDXB_DEVICE_EXTENSION pExt, 
                                DXB_BUS_MODE BusMode );

VOID dxbQueueInitializeEventDpcTimer( IN PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStartEventDpcTimer( PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStopEventDpcTimer( PDXB_DEVICE_EXTENSION pExt );

VOID dxbQueueInitializeCmdWorkQueue( IN PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStartCmdDpcTimer( PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStopCmdDpcTimer( PDXB_DEVICE_EXTENSION pExt );

VOID dxbQueueInitializeCreditWorkQueue( IN PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStartCreditDpcTimer( PDXB_DEVICE_EXTENSION pExt );
VOID dxbQueueStopCreditDpcTimer( PDXB_DEVICE_EXTENSION pExt );


#endif

