tape3490.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /***************************************************************************
  2.  *
  3.  *  drivers/s390/char/tape3490.c
  4.  *    tape device discipline for 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. #include "tapedefs.h"
  14. #include <linux/version.h>
  15. #include <asm/ccwcache.h> /* CCW allocations      */
  16. #include <asm/s390dyn.h>
  17. #include <asm/debug.h>
  18. #include <linux/compatmac.h>
  19. #include "tape.h"
  20. #include "tape34xx.h"
  21. #include "tape3490.h"
  22. tape_event_handler_t tape3490_event_handler_table[TS_SIZE][TE_SIZE] =
  23. {
  24.     /* {START , DONE, FAILED, ERROR, OTHER } */
  25. {NULL, tape34xx_unused_done, NULL, NULL, NULL}, /* TS_UNUSED */
  26. {NULL, tape34xx_idle_done, NULL, NULL, NULL}, /* TS_IDLE */
  27. {NULL, NULL, NULL, NULL, NULL}, /* TS_DONE */
  28. {NULL, NULL, NULL, NULL, NULL}, /* TS_FAILED */
  29. {NULL, tape34xx_block_done, NULL, NULL, NULL}, /* TS_BLOCK_INIT */
  30. {NULL, tape34xx_bsb_init_done, NULL, NULL, NULL}, /* TS_BSB_INIT */
  31. {NULL, tape34xx_bsf_init_done, NULL, NULL, NULL}, /* TS_BSF_INIT */
  32. {NULL, tape34xx_dse_init_done, NULL, NULL, NULL}, /* TS_DSE_INIT */
  33. {NULL, NULL, NULL, NULL, NULL}, /* TS_EGA_INIT */
  34. {NULL, tape34xx_fsb_init_done, NULL, NULL, NULL}, /* TS_FSB_INIT */
  35. {NULL, tape34xx_fsf_init_done, NULL, NULL, NULL}, /* TS_FSF_INIT */
  36. {NULL, NULL, NULL, NULL, NULL}, /* TS_LDI_INIT */
  37. {NULL, tape34xx_lbl_init_done, NULL, NULL, NULL}, /* TS_LBL_INIT */
  38. {NULL, NULL, NULL, NULL, NULL}, /* TS_MSE_INIT */
  39. {NULL, tape34xx_nop_init_done, NULL, NULL, NULL}, /* TS_NOP_INIT */
  40. {NULL, tape34xx_rfo_init_done, NULL, NULL, NULL}, /* TS_RBA_INIT */
  41. {NULL, tape34xx_rbi_init_done, NULL, NULL, NULL}, /* TS_RBI_INIT */
  42. {NULL, NULL, NULL, NULL, NULL}, /* TS_RBU_INIT */
  43. {NULL, NULL, NULL, NULL, NULL}, /* TS_RBL_INIT */
  44. {NULL, NULL, NULL, NULL, NULL}, /* TS_RDC_INIT */
  45. {NULL, tape34xx_rfo_init_done, NULL, NULL, NULL}, /* TS_RFO_INIT */
  46. {NULL, NULL, NULL, NULL, NULL}, /* TS_RSD_INIT */
  47. {NULL, tape34xx_rew_init_done, NULL, NULL, NULL}, /* TS_REW_INIT */
  48. {NULL, tape34xx_rew_release_init_done, NULL, NULL, NULL}, /* TS_REW_RELEASE_IMIT */
  49. {NULL, tape34xx_run_init_done, NULL, NULL, NULL}, /* TS_RUN_INIT */
  50. {NULL, NULL, NULL, NULL, NULL}, /* TS_SEN_INIT */
  51. {NULL, NULL, NULL, NULL, NULL}, /* TS_SID_INIT */
  52. {NULL, NULL, NULL, NULL, NULL}, /* TS_SNP_INIT */
  53. {NULL, NULL, NULL, NULL, NULL}, /* TS_SPG_INIT */
  54. {NULL, NULL, NULL, NULL, NULL}, /* TS_SWI_INIT */
  55. {NULL, NULL, NULL, NULL, NULL}, /* TS_SMR_INIT */
  56. {NULL, NULL, NULL, NULL, NULL}, /* TS_SYN_INIT */
  57. {NULL, NULL, NULL, NULL, NULL}, /* TS_TIO_INIT */
  58. {NULL, NULL, NULL, NULL, NULL}, /* TS_UNA_INIT */
  59. {NULL, tape34xx_wri_init_done, NULL, NULL, NULL}, /* TS_WRI_INIT */
  60. {NULL, tape34xx_wtm_init_done, NULL, NULL, NULL}, /* TS_WTM_INIT */
  61.         {NULL, NULL, NULL, NULL, NULL}};     /* TS_NOT_OPER */
  62. devreg_t tape3490_devreg = {
  63.     ci:
  64.     {hc:
  65.      {ctype:0x3490}},
  66.     flag:DEVREG_MATCH_CU_TYPE | DEVREG_TYPE_DEVCHARS,
  67.     oper_func:tape_oper_handler
  68. };
  69. void
  70. tape3490_setup_assist (tape_info_t * ti)
  71. {
  72. tape3490_disc_data_t *data = NULL;
  73. #ifdef TAPE_DEBUG
  74.     debug_text_event (tape_debug_area,6,"3490 dsetu");
  75.     debug_text_event (tape_debug_area,6,"dev:");
  76.     debug_int_event (tape_debug_area,6,ti->blk_minor);
  77. #endif /* TAPE_DEBUG */
  78. while (data == NULL)
  79. data = kmalloc (sizeof (tape3490_disc_data_t), GFP_KERNEL);
  80. data->modeset_byte = 0x00;
  81. ti->discdata = (void *) data;
  82. }
  83. void
  84. tape3490_shutdown (int autoprobe) {
  85.     if (autoprobe)
  86. s390_device_unregister(&tape3490_devreg);
  87. }
  88. tape_discipline_t *
  89. tape3490_init (int autoprobe)
  90. {
  91. tape_discipline_t *disc;
  92. #ifdef TAPE_DEBUG
  93.     debug_text_event (tape_debug_area,3,"3490 init");
  94. #endif /* TAPE_DEBUG */
  95. disc = kmalloc (sizeof (tape_discipline_t), GFP_KERNEL);
  96. if (disc == NULL) {
  97. #ifdef TAPE_DEBUG
  98.         debug_text_exception (tape_debug_area,3,"disc:nomem");
  99. #endif /* TAPE_DEBUG */
  100. return disc;
  101. }
  102. disc->cu_type = 0x3490;
  103. disc->setup_assist = tape3490_setup_assist;
  104. disc->error_recovery = tape34xx_error_recovery;
  105. disc->write_block = tape34xx_write_block;
  106. disc->free_write_block = tape34xx_free_write_block;
  107. disc->read_block = tape34xx_read_block;
  108. disc->free_read_block = tape34xx_free_read_block;
  109. disc->mtfsf = tape34xx_mtfsf;
  110. disc->mtbsf = tape34xx_mtbsf;
  111. disc->mtfsr = tape34xx_mtfsr;
  112. disc->mtbsr = tape34xx_mtbsr;
  113. disc->mtweof = tape34xx_mtweof;
  114. disc->mtrew = tape34xx_mtrew;
  115. disc->mtoffl = tape34xx_mtoffl;
  116. disc->mtnop = tape34xx_mtnop;
  117. disc->mtbsfm = tape34xx_mtbsfm;
  118. disc->mtfsfm = tape34xx_mtfsfm;
  119. disc->mteom = tape34xx_mteom;
  120. disc->mterase = tape34xx_mterase;
  121. disc->mtsetdensity = tape34xx_mtsetdensity;
  122. disc->mtseek = tape34xx_mtseek;
  123. disc->mttell = tape34xx_mttell;
  124. disc->mtsetdrvbuffer = tape34xx_mtsetdrvbuffer;
  125. disc->mtlock = tape34xx_mtlock;
  126. disc->mtunlock = tape34xx_mtunlock;
  127. disc->mtload = tape34xx_mtload;
  128. disc->mtunload = tape34xx_mtunload;
  129. disc->mtcompression = tape34xx_mtcompression;
  130. disc->mtsetpart = tape34xx_mtsetpart;
  131. disc->mtmkpart = tape34xx_mtmkpart;
  132. disc->mtiocget = tape34xx_mtiocget;
  133. disc->mtiocpos = tape34xx_mtiocpos;
  134. disc->shutdown = tape3490_shutdown;
  135. disc->discipline_ioctl_overload = tape34xx_ioctl_overload;
  136. disc->event_table = &tape3490_event_handler_table;
  137. disc->default_handler = tape34xx_default_handler;
  138. disc->bread = tape34xx_bread;
  139. disc->free_bread = tape34xx_free_bread;
  140. disc->tape = NULL; /* pointer for backreference */
  141. disc->next = NULL;
  142. if (autoprobe)
  143.     s390_device_register(&tape3490_devreg);
  144. #ifdef TAPE_DEBUG
  145. debug_text_event (tape_debug_area,3,"3490 regis");
  146. #endif /* TAPE_DEBUG */
  147. return disc;
  148. }