/*
 * device.h
 *
 * Copyright 2002, Minoru Murashima. All rights reserved.
 * Distributed under the terms of the BSD License.
 */


#ifndef device_h
#define device_h


#include<types.h>
#include<proc.h>
#include<fs.h>
#include<sys/conf.h>


#ifndef ASM_FILE


enum{
	/* デバイス種別。 */
	DEV_CLASS_BLOCK=0,		/* ブロックデバイス。 */
	DEV_CLASS_CHARA,		/* キャラクターデバイス。 */
	DEV_CLASS_NETWORK,		/* ネットワークデバイス。 */

	DEVICE_ROOT_INODE = 0,	// デバイスファイルシステムルートinode番号
};


// 割り込み待ち用構造体
typedef struct WAIT_INTR{
	PROC *proc;		// 割り込み待ちプロセス。
	int isDel;		// プロセススケジュールから切断する前に接続処理がきたときにプロセススケジュールで設定する。
	int lock;		// スピンロックゲート。
}WAIT_INTR;


#define DEV_FS_NAME "devFs"


/* デバイスステート構造体。 */
typedef struct{
	ushort		major;			// メジャー番号
	ushort		prt_num;		// パーティションナンバー＝マイナー番号
	ushort		prt_type;		// パーティションタイプ
	ushort		sect_size;		// セクターサイズ
	uint		all_sect;		// 全セクター数
	const char *name;
}DEV_STAT;


extern void wait_intr(WAIT_INTR*,uint,int);
extern int wake_intr(WAIT_INTR*,int);
extern int initDeviceFs();
extern int initBlockCache();
extern int mountDeviceFs();
extern int registBlockPartition(const char*);
extern int delete_device(const char*);
extern int get_devstat(int,DEV_STAT*);
extern int sys_sync();
extern int read_direct(int,void*,size_t,size_t);
extern int write_direct(int,void*,size_t,size_t);
extern int read_cache(int,void*,size_t,size_t);
extern int write_cache(int,void*,size_t,size_t);
extern int sys_ttyname(int,char*);


#endif


#endif
