#ifndef TAPEDEV_H
#define TAPEDEV_H

#define PCI_VENDOR_ID_TAPEDEV				0x664e
#define PCI_DEVICE_ID_TAPEDEV		    		0x7ea

#define TAPEDEV_ENABLE_ADDR		    		0x00
#define TAPEDEV_STATUS_ADDR		    		0x04
#define TAPEDEV_IRQ_STATUS_ADDR		    		0x08
#define TAPEDEV_IRQ_MASK_ADDR		    		0x0c
#define TAPEDEV_IRQ_CLEAR_ADDR		    		0x10
#define TAPEDEV_SECTIONS_ADDR		    		0x14

#define TAPEDEV_STATUS_DISABLED		    		0
#define TAPEDEV_STATUS_IDLE		    		1
#define TAPEDEV_STATUS_ERROR		    		2

#define TAPEDEV_IRQ_INIT_DONE		    		0
#define TAPEDEV_IRQ_HW_ERROR		    		1
#define TAPEDEV_IRQ_SECT_0_DONE		    		16
#define TAPEDEV_IRQ_SECT_1_DONE		    		17
#define TAPEDEV_IRQ_SECT_2_DONE		    		18
#define TAPEDEV_IRQ_SECT_3_DONE		    		19
#define TAPEDEV_IRQ_SECT_4_DONE		    		20
#define TAPEDEV_IRQ_SECT_5_DONE		    		21
#define TAPEDEV_IRQ_SECT_6_DONE		    		22
#define TAPEDEV_IRQ_SECT_7_DONE		    		23
#define TAPEDEV_IRQ_SECT_0_ERROR	    		24
#define TAPEDEV_IRQ_SECT_1_ERROR	    		25
#define TAPEDEV_IRQ_SECT_2_ERROR	    		26
#define TAPEDEV_IRQ_SECT_3_ERROR	    		27
#define TAPEDEV_IRQ_SECT_4_ERROR	    		28
#define TAPEDEV_IRQ_SECT_5_ERROR	    		29
#define TAPEDEV_IRQ_SECT_6_ERROR	    		30
#define TAPEDEV_IRQ_SECT_7_ERROR	    		31

#define TAPEDEV_SECT_CMD_ADDR		    		0x00
#define TAPEDEV_SECT_STATUS_ADDR	    		0x04
#define TAPEDEV_SECT_BUFFER_PTR_ADDR		        0x08
#define TAPEDEV_SECT_TAPE_NO_ADDR		    	0x0C
#define TAPEDEV_SECT_TAPES_ADDR		    		0x10
#define TAPEDEV_SECT_TAPE_SIZE_ADDR	    		0x14
#define TAPEDEV_SECT_TAPE_BLOCKSIZE_ADDR	        0x18

#define TAPEDEV_SECT_PTR_SHIFT		    		9

#define TAPEDEV_SECT_BLOCKSIZE_512	    		0
#define TAPEDEV_SECT_BLOCKSIZE_1024	    		1
#define TAPEDEV_SECT_BLOCKSIZE_2048	    		2
#define TAPEDEV_SECT_BLOCKSIZE_4096	    		3
#define TAPEDEV_SECT_BLOCKSIZE_8192	    		4
#define TAPEDEV_SECT_MAX_BLOCKSIZE	    		8192

#define TAPEDEV_CMD_TAKE_TAPE				0x00
#define TAPEDEV_CMD_EJECT_TAPE				0x01
#define TAPEDEV_CMD_REWIND				0x02
#define TAPEDEV_CMD_FAST_FWD				0x03
#define TAPEDEV_CMD_READ				0x04
#define TAPEDEV_CMD_WRITE				0x05

#define TAPEDEV_SECT_STATUS_IDLE			0x00
#define TAPEDEV_SECT_STATUS_WORKING                 	0x01
#define TAPEDEV_SECT_STATUS_DONE                    	0x02
#define TAPEDEV_SECT_STATUS_ERR_INVALID_CMD         	0x80
#define TAPEDEV_SECT_STATUS_ERR_TAPE_ACTIVE         	0x81
#define TAPEDEV_SECT_STATUS_ERR_NO_TAPE             	0x82
#define TAPEDEV_SECT_STATUS_ERR_RESET               	0x83
#define TAPEDEV_SECT_STATUS_ERR_INVALID_TAPE_NO     	0x84
#define TAPEDEV_SECT_STATUS_ERR_INVALID_FFWD_POS    	0x85
#define TAPEDEV_SECT_STATUS_ERR_READ_PAST_END       	0x86
#define TAPEDEV_SECT_STATUS_ERR_WRITE_PAST_END      	0x87
#define TAPEDEV_SECT_STATUS_ERR_IO                  	0x88
#define TAPEDEV_SECT_STATUS_ERR_PGTABLE             	0x89

#define TAPEDEV_SECT_STATUS_ERR_MASK                	0x80

#define TAPEDEV_BUF_PGTABLE_SIZE                    	4096
#define TAPEDEV_BUF_PGTABLE_ENTRIES                 	(TAPEDEV_BUF_PGTABLE_SIZE/8)

#endif
