/*******************************************************************
*
*				 MPINIT.H
*
*				 Copyright (C) 1995 SGS-THOMSON Microelectronics.
*
*
*				 Prototypes for MPINIT.C
*
*******************************************************************/
#ifndef __MPINIT_H__
#define __MPINIT_H__
#define NO_ERROR 0
#ifndef NULL
#define NULL 0
#endif
#define ERROR_CARD_NOT_FOUND 		1
#define ERROR_NOT_ENOUGH_MEMORY  2
#define ERROR_COMMAND_NOT_IMPLEMENTED 3
// BGP #define VIDEO_PACKET_TIMER (10*1000)
#define VIDEO_PACKET_TIMER (5*1000)
#define AUDIO_PACKET_TIMER (10*1000)
#define MEM_WINDOW_SIZE (128*1024)
typedef struct _VIDEO_DEVICE_EXTENSION {
   BOOLEAN 						EOSInProgress;      // End Of Stream ha been sent to device
	KSSTATE 		DeviceState;
	STREAM_SYSTEM_TIME			videoSTC;
	PHW_STREAM_REQUEST_BLOCK  	pCurrentSRB;
   ULONG   						StarvationCount;        // number of times device was starved since last reset
	ULONG	cPacket;									// current packet in process
	ULONG	cOffs;										// offset into the current packet
	PKSDATA_PACKET pPacket;
	PVOID pDMABuf;
} VIDEO_DEVICE_EXTENSION, *PVIDEO_DEVICE_EXTENSION;

typedef struct _AUDIO_DEVICE_EXTENSION {
	STREAM_SYSTEM_TIME		audioSTC;
	KSSTATE 	DeviceState;
	PHW_STREAM_REQUEST_BLOCK  pCurrentSRB;
   ULONG   					StarvationCount;        // number of times device was starved since last reset
	ULONG	  					ByteSent;
	ULONG	cPacket;									// current packet in process
	ULONG	cOffs;										// offset into the current packet
	PKSDATA_PACKET pPacket;
} AUDIO_DEVICE_EXTENSION, *PAUDIO_DEVICE_EXTENSION;

typedef struct _HW_DEVICE_EXTENSION {
	KSSTATE stState;
	PUSHORT  					ioBaseLocal;
	PUSHORT  					ioBasePCI9060;
	USHORT						Irq;
	BOOLEAN						bVideoInt;
	BOOLEAN						bAudioInt;
	PHW_STREAM_REQUEST_BLOCK	AudioQ;
	PHW_STREAM_REQUEST_BLOCK	VideoQ;
	VIDEO_DEVICE_EXTENSION 	VideoDeviceExt;
	AUDIO_DEVICE_EXTENSION 	AudioDeviceExt;
	PHW_STREAM_REQUEST_BLOCK pCurSrb;
	PHW_STREAM_REQUEST_BLOCK pSrbQ;
} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;

typedef VOID (*PFN_WRITE_DATA)  (PHW_STREAM_REQUEST_BLOCK pSrb);

typedef struct _STREAMEX {
	PFN_WRITE_DATA pfnWriteData;
	PFN_WRITE_DATA pfnSetState;
	PFN_WRITE_DATA pfnGetProp;
} STREAMEX, *PSTREAMEX;

typedef struct _MRP_EXTENSION {

    ULONG           Status;
} MRP_EXTENSION, * PMRP_EXTENSION;

NTSTATUS HwInitialize (IN PHW_STREAM_REQUEST_BLOCK pSrb );
BOOLEAN HwUnInitialize ( IN PVOID DeviceExtension);
BOOLEAN HwInterrupt ( IN PVOID pDeviceExtension );
VOID AudioEnableInterrupts(IN PVOID pHwDeviceExtension);
VOID STEnableInterrupts( IN PVOID pHwDeviceExtension );
VOID STDeferredCallback ( IN PVOID pHwDeviceExtension );
VOID TmpDeferredCallback ( IN PVOID pHwDeviceExtension );
VOID AudioTimerCallBack(IN PHW_DEVICE_EXTENSION pDeviceExtension);
ULONG DriverEntry (PVOID Context1, PVOID Context2);

// Function Prototype for the locally defined functions

BOOLEAN HwStartIo (
				IN PVOID DeviceExtension,
				PHW_STREAM_REQUEST_BLOCK pMrb
				);


VOID AdapterOpenStream(PHW_STREAM_REQUEST_BLOCK pSrb);

VOID AdapterCloseStream(PHW_STREAM_REQUEST_BLOCK pSrb);

VOID STREAMAPI AdapterReceivePacket(IN PHW_STREAM_REQUEST_BLOCK Srb);
VOID STREAMAPI AdapterCancelPacket(IN PHW_STREAM_REQUEST_BLOCK Srb);
VOID STREAMAPI AdapterTimeoutPacket(IN PHW_STREAM_REQUEST_BLOCK Srb);

VOID HostDisableIT(VOID);
VOID HostEnableIT(VOID);


PHW_STREAM_REQUEST_BLOCK Dequeue(PHW_DEVICE_EXTENSION pdevext);

VOID STREAMAPI StreamReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb);
VOID STREAMAPI StreamReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb);

VOID AdapterStreamInfo(PHW_STREAM_REQUEST_BLOCK pSrb);

VOID StreamStartCommand (PHW_DEVICE_EXTENSION pdevext);

void Enqueue (PHW_STREAM_REQUEST_BLOCK pSrb, PHW_DEVICE_EXTENSION pdevext);

#endif //__MPINIT_H__