tape.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /***************************************************************************
  2.  *
  3.  *  drivers/s390/char/tape.h
  4.  *    tape device driver for 3480/3490E tapes.
  5.  *
  6.  *  S390 and zSeries version
  7.  *    Copyright (C) 2001 IBM Corporation
  8.  *    Author(s): Carsten Otte <cotte@de.ibm.com>
  9.  *               Tuan Ngo-Anh <ngoanh@de.ibm.com>
  10.  *
  11.  ****************************************************************************
  12.  */
  13. #ifndef _TAPE_H
  14. #define _TAPE_H
  15. #include <linux/config.h>
  16. #include <linux/blkdev.h>
  17. #define  MAX_TAPES                     7        /* Max tapes supported is 7*/
  18. #define TAPE_MAGIC 0xE3C1D7C5       /* is ebcdic-"TAPE" */
  19. typedef enum {
  20.     TS_UNUSED=0, TS_IDLE, TS_DONE, TS_FAILED,
  21.     TS_BLOCK_INIT,
  22.     TS_BSB_INIT,
  23.     TS_BSF_INIT,
  24.     TS_DSE_INIT,
  25.     TS_EGA_INIT,
  26.     TS_FSB_INIT,
  27.     TS_FSF_INIT,
  28.     TS_LDI_INIT,
  29.     TS_LBL_INIT,
  30.     TS_MSE_INIT,
  31.     TS_NOP_INIT,
  32.     TS_RBA_INIT,
  33.     TS_RBI_INIT,
  34.     TS_RBU_INIT,
  35.     TS_RBL_INIT,
  36.     TS_RDC_INIT,
  37.     TS_RFO_INIT,
  38.     TS_RSD_INIT,
  39.     TS_REW_INIT,
  40.     TS_REW_RELEASE_INIT,
  41.     TS_RUN_INIT,
  42.     TS_SEN_INIT,
  43.     TS_SID_INIT,
  44.     TS_SNP_INIT,
  45.     TS_SPG_INIT,
  46.     TS_SWI_INIT,
  47.     TS_SMR_INIT,
  48.     TS_SYN_INIT,
  49.     TS_TIO_INIT,
  50.     TS_UNA_INIT,
  51.     TS_WRI_INIT,
  52.     TS_WTM_INIT,
  53.     TS_NOT_OPER,
  54.     TS_SIZE } tape_stat;
  55. struct _tape_info_t; //Forward declaration
  56. typedef enum {
  57.     TE_START=0, TE_DONE, TE_FAILED, TE_ERROR, TE_OTHER,
  58.     TE_SIZE } tape_events;
  59. typedef void (*tape_disc_shutdown_t) (int);
  60. typedef void (*tape_event_handler_t) (struct _tape_info_t*);
  61. typedef ccw_req_t* (*tape_ccwgen_t)(struct _tape_info_t* ti,int count);
  62. typedef ccw_req_t* (*tape_reqgen_t)(struct request* req,struct _tape_info_t* ti,int tapeblock_major);
  63. typedef ccw_req_t* (*tape_rwblock_t)(const char* data,size_t count,struct _tape_info_t* ti);
  64. typedef void (*tape_freeblock_t)(ccw_req_t* cqr,struct _tape_info_t* ti);
  65. typedef void (*tape_setup_assist_t) (struct _tape_info_t*);
  66. #ifdef CONFIG_DEVFS_FS
  67. typedef void (*tape_devfs_handler_t) (struct _tape_info_t*);
  68. #endif
  69. typedef tape_event_handler_t tape_event_table_t[TS_SIZE][TE_SIZE];
  70. typedef struct _tape_discipline_t {
  71.     unsigned int cu_type;
  72.     tape_setup_assist_t setup_assist;
  73.     tape_event_handler_t error_recovery;
  74.     tape_reqgen_t bread;
  75.     tape_freeblock_t free_bread;
  76.     tape_rwblock_t write_block;
  77.     tape_freeblock_t free_write_block;
  78.     tape_rwblock_t read_block;
  79.     tape_freeblock_t free_read_block;
  80.     tape_ccwgen_t mtfsf;
  81.     tape_ccwgen_t mtbsf;
  82.     tape_ccwgen_t mtfsr;
  83.     tape_ccwgen_t mtbsr;
  84.     tape_ccwgen_t mtweof;
  85.     tape_ccwgen_t mtrew;
  86.     tape_ccwgen_t mtoffl;
  87.     tape_ccwgen_t mtnop;
  88.     tape_ccwgen_t mtbsfm;
  89.     tape_ccwgen_t mtfsfm;
  90.     tape_ccwgen_t mteom;
  91.     tape_ccwgen_t mterase;
  92.     tape_ccwgen_t mtsetdensity;
  93.     tape_ccwgen_t mtseek;
  94.     tape_ccwgen_t mttell;
  95.     tape_ccwgen_t mtsetdrvbuffer;
  96.     tape_ccwgen_t mtlock;
  97.     tape_ccwgen_t mtunlock;
  98.     tape_ccwgen_t mtload;
  99.     tape_ccwgen_t mtunload;
  100.     tape_ccwgen_t mtcompression;
  101.     tape_ccwgen_t mtsetpart;
  102.     tape_ccwgen_t mtmkpart;
  103.     tape_ccwgen_t mtiocget;
  104.     tape_ccwgen_t mtiocpos;
  105.     tape_disc_shutdown_t shutdown;
  106.     int (*discipline_ioctl_overload)(struct inode *,struct file*, unsigned int,unsigned long);
  107.     tape_event_table_t* event_table;
  108.     tape_event_handler_t default_handler;
  109.     struct _tape_info_t* tape; /* pointer for backreference */
  110.     void* next;
  111. } tape_discipline_t  __attribute__ ((aligned(8)));
  112. typedef struct _tape_frontend_t {
  113.     tape_setup_assist_t device_setup;
  114. #ifdef CONFIG_DEVFS_FS
  115.     tape_devfs_handler_t mkdevfstree;
  116.     tape_devfs_handler_t rmdevfstree;
  117. #endif
  118.     void* next;
  119. } tape_frontend_t  __attribute__ ((aligned(8)));
  120. typedef struct _tape_info_t {
  121.     wait_queue_head_t wq;
  122.     s390_dev_info_t devinfo;             /* device info from Common I/O */
  123.     int     wanna_wakeup;
  124.     int     rew_minor;                  /* minor number for the rewinding tape */
  125.     int     nor_minor;                  /* minor number for the nonrewinding tape */
  126.     int     blk_minor;                  /* minor number for the block device */
  127.     devstat_t devstat;            /* contains irq, devno, status */
  128.     size_t  block_size;             /* block size of tape        */
  129.     int    drive_type;              /* Code indicating type of drive */
  130.     struct file *rew_filp;            /* backpointer to file structure */
  131.     struct file *nor_filp;
  132.     struct file *blk_filp;
  133.     int tape_state;  /* State of the device. See tape_stat */
  134.     int rc;          /* Return code. */
  135.     tape_discipline_t* discipline;
  136.     request_queue_t request_queue;
  137.     struct request* current_request;
  138.     int blk_retries;
  139.     long position;
  140.     int medium_is_unloaded;  // Becomes true when a unload-type operation was issued, false again when medium-insert was detected
  141.     ccw_req_t* cqr;
  142.     atomic_t bh_scheduled;
  143.     struct tq_struct bh_tq;
  144. #ifdef CONFIG_DEVFS_FS
  145.     devfs_handle_t devfs_dir;             /* devfs handle for tape/DEVNO directory */
  146.     devfs_handle_t devfs_char_dir;        /* devfs handle for tape/DEVNO/char directory */
  147.     devfs_handle_t devfs_block_dir;       /* devfs handle for tape/DEVNO/block directory */
  148.     devfs_handle_t devfs_nonrewinding;    /* devfs handle for tape/DEVNO/char/nonrewinding device */
  149.     devfs_handle_t devfs_rewinding;       /* devfs handle for tape/DEVNO/char/rewinding device */
  150.     devfs_handle_t devfs_disc;            /* devfs handle for tape/DEVNO/block/disc device */
  151. #endif
  152.     void* discdata;
  153.     void* kernbuf;
  154.     void* userbuf;
  155.     void*  next;
  156. } tape_info_t  __attribute__ ((aligned(8)));
  157. /* tape initialisation functions */
  158. int tape_init(void);
  159. int tape_setup (tape_info_t * ti, int irq, int minor);
  160. /* functoins for alloc'ing ccw stuff */
  161. inline  ccw_req_t * tape_alloc_ccw_req (tape_info_t* ti, int cplength, int datasize);
  162. void tape_free_request (ccw_req_t * request);
  163. /* a function for dumping device sense info */
  164. void tape_dump_sense (devstat_t * stat);
  165. #ifdef CONFIG_S390_TAPE_DYNAMIC
  166. /* functions for dyn. dev. attach/detach */
  167. int tape_oper_handler ( int irq, struct _devreg *dreg);
  168. #endif
  169. /* functions for handling the status of a device */
  170. inline void tapestate_set (tape_info_t * ti, int newstate);
  171. inline int tapestate_get (tape_info_t * ti);
  172. void tapestate_event (tape_info_t * ti, int event);
  173. extern char* state_verbose[TS_SIZE];
  174. extern char* event_verbose[TE_SIZE];
  175. /****************************************************************************/
  176. /* Some linked lists for storing plugins and devices */
  177. extern tape_info_t *first_tape_info;
  178. extern tape_discipline_t *first_discipline;
  179. extern tape_frontend_t *first_frontend;
  180. /* The debug area */
  181. #ifdef TAPE_DEBUG
  182. extern debug_info_t *tape_debug_area;
  183. #endif
  184. #endif /* for ifdef tape.h */