/*++
*******************************************************************************
* 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:

   dxbslave.h

Abstract:

   Routines to access adapter memory in slave mode (i.e. direct reads and writes to 
   adapter shared memory).  The adapter extension contains a table of function 
   pointers for read/write routines which are setup using the initialization 
	routines below.  Supports both windowed and flat memory adapters.
   
   These routines abstract the windowed nature of ISA adapters, presenting all 
   adapters as if shared memory were flat, like that of PCI adapters.
   
Author:

   Michael Zarns

--*/
#ifndef DXBSLAVE
#define DXBSLAVE

#define IsDwordAligned( Foo ) ( ( (ULONG_PTR)(Foo) % sizeof (ULONG) ) == 0 )
#define IsWordAligned( Foo ) ( ( (ULONG_PTR)(Foo) % sizeof (USHORT) ) == 0 )


///////////////////////////////////////////////////////////////////////////////
//
// Initialization
//

VOID DxbSlaveSetAdapterWindowed( PDXB_DEVICE_EXTENSION      pExt,
                                 PDXB_MEMORY_WINDOW_ENABLE  pEnable,
                                 PDXB_MEMORY_WINDOW_DISABLE pDisable );

VOID DxbSlaveSetAdapterFlatMemory( PDXB_DEVICE_EXTENSION pExt );

NTSTATUS dxbMapMemory( IN PDIGI_IO_RESOURCE    pResource,
                       IN OUT PDXB_IO_RESOURCE pDxbMem );


///////////////////////////////////////////////////////////////////////////////
//
// Write
//

#define DxbAdapterWrite( pExt, pBuf, Offset, cb )		pExt->Adapter.Write( pExt, pBuf, Offset, cb )
#define DxbAdapterWriteByte( pExt, Offset, Data )		pExt->Adapter.WriteByte( pExt, Offset, Data )
#define DxbAdapterWriteWord( pExt, Offset, Data )		pExt->Adapter.WriteWord( pExt, Offset, Data )
#define DxbAdapterWriteDword( pExt, Offset, Data )		pExt->Adapter.WriteDword( pExt, Offset, Data )


///////////////////////////////////////////////////////////////////////////////
//
// Read
//

#define DxbAdapterRead( pExt, pBuf, Offset, cb )		pExt->Adapter.Read( pExt, pBuf, Offset, cb )
#define DxbAdapterReadByte( pExt, Offset )				pExt->Adapter.ReadByte( pExt, Offset )
#define DxbAdapterReadWord( pExt, Offset )				pExt->Adapter.ReadWord( pExt, Offset )
#define DxbAdapterReadDword( pExt, Offset )				pExt->Adapter.ReadDword( pExt, Offset )


///////////////////////////////////////////////////////////////////////////////
//
// Windowing 
//

#define DxbEnableWindow( pExt, Window )	pExt->Adapter.Enable( pExt, Window )
#define DxbDisableWindow( pExt )				pExt->Adapter.Disable( pExt );

#endif
