1/*
2 * Copyright 2013, J��r��me Duval, korli@users.berlios.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef VIRTIO_RNG_PRIVATE_H
6#define VIRTIO_RNG_PRIVATE_H
7
8
9#include <condition_variable.h>
10#include <dpc.h>
11#include <lock.h>
12#include "random.h"
13#include <virtio.h>
14
15
16//#define TRACE_VIRTIO_RNG
17#ifdef TRACE_VIRTIO_RNG
18#	define TRACE(x...) dprintf("virtio_rng: " x)
19#else
20#	define TRACE(x...) ;
21#endif
22#define ERROR(x...)			dprintf("\33[33mvirtio_rng:\33[0m " x)
23#define CALLED() 			TRACE("CALLED %s\n", __PRETTY_FUNCTION__)
24
25
26extern device_manager_info* gDeviceManager;
27extern random_for_controller_interface *gRandom;
28extern dpc_module_info *gDPC;
29
30
31class VirtioRNGDevice {
32public:
33								VirtioRNGDevice(device_node* node);
34								~VirtioRNGDevice();
35
36			status_t			InitCheck();
37
38protected:
39	static	int32				HandleTimerHook(struct timer* timer);
40	static	void				HandleDPC(void* arg);
41
42private:
43	static	void				_RequestCallback(void* driverCookie,
44									void *cookie);
45			void				_RequestInterrupt();
46			status_t			_Enqueue();
47
48			virtio_device_interface* fVirtio;
49			virtio_device*		fVirtioDevice;
50
51			status_t			fStatus;
52			uint64				fFeatures;
53			::virtio_queue		fVirtioQueue;
54
55			spinlock			fInterruptLock;
56			ConditionVariable	fInterruptCondition;
57			ConditionVariableEntry fInterruptConditionEntry;
58			bool				fExpectsInterrupt;
59
60			timer				fTimer;
61			void*				fDPCHandle;
62};
63
64
65#endif // VIRTIO_RNG_PRIVATE_H
66