osst.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * $Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
  4. */
  5. #include <asm/byteorder.h>
  6. #include <linux/completion.h>
  7. #include <linux/mutex.h>
  8. /* FIXME - rename and use the following two types or delete them!
  9. * and the types really should go to st.h anyway...
  10. * INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
  11. */
  12. typedef struct {
  13. unsigned device_type :5; /* Peripheral Device Type */
  14. unsigned reserved0_765 :3; /* Peripheral Qualifier - Reserved */
  15. unsigned reserved1_6t0 :7; /* Reserved */
  16. unsigned rmb :1; /* Removable Medium Bit */
  17. unsigned ansi_version :3; /* ANSI Version */
  18. unsigned ecma_version :3; /* ECMA Version */
  19. unsigned iso_version :2; /* ISO Version */
  20. unsigned response_format :4; /* Response Data Format */
  21. unsigned reserved3_45 :2; /* Reserved */
  22. unsigned reserved3_6 :1; /* TrmIOP - Reserved */
  23. unsigned reserved3_7 :1; /* AENC - Reserved */
  24. u8 additional_length; /* Additional Length (total_length-4) */
  25. u8 rsv5, rsv6, rsv7; /* Reserved */
  26. u8 vendor_id[8]; /* Vendor Identification */
  27. u8 product_id[16]; /* Product Identification */
  28. u8 revision_level[4]; /* Revision Level */
  29. u8 vendor_specific[20]; /* Vendor Specific - Optional */
  30. u8 reserved56t95[40]; /* Reserved - Optional */
  31. /* Additional information may be returned */
  32. } idetape_inquiry_result_t;
  33. /*
  34. * READ POSITION packet command - Data Format (From Table 6-57)
  35. */
  36. typedef struct {
  37. unsigned reserved0_10 :2; /* Reserved */
  38. unsigned bpu :1; /* Block Position Unknown */
  39. unsigned reserved0_543 :3; /* Reserved */
  40. unsigned eop :1; /* End Of Partition */
  41. unsigned bop :1; /* Beginning Of Partition */
  42. u8 partition; /* Partition Number */
  43. u8 reserved2, reserved3; /* Reserved */
  44. u32 first_block; /* First Block Location */
  45. u32 last_block; /* Last Block Location (Optional) */
  46. u8 reserved12; /* Reserved */
  47. u8 blocks_in_buffer[3]; /* Blocks In Buffer - (Optional) */
  48. u32 bytes_in_buffer; /* Bytes In Buffer (Optional) */
  49. } idetape_read_position_result_t;
  50. /*
  51. * Follows structures which are related to the SELECT SENSE / MODE SENSE
  52. * packet commands.
  53. */
  54. #define COMPRESSION_PAGE 0x0f
  55. #define COMPRESSION_PAGE_LENGTH 16
  56. #define CAPABILITIES_PAGE 0x2a
  57. #define CAPABILITIES_PAGE_LENGTH 20
  58. #define TAPE_PARAMTR_PAGE 0x2b
  59. #define TAPE_PARAMTR_PAGE_LENGTH 16
  60. #define NUMBER_RETRIES_PAGE 0x2f
  61. #define NUMBER_RETRIES_PAGE_LENGTH 4
  62. #define BLOCK_SIZE_PAGE 0x30
  63. #define BLOCK_SIZE_PAGE_LENGTH 4
  64. #define BUFFER_FILLING_PAGE 0x33
  65. #define BUFFER_FILLING_PAGE_LENGTH 4
  66. #define VENDOR_IDENT_PAGE 0x36
  67. #define VENDOR_IDENT_PAGE_LENGTH 8
  68. #define LOCATE_STATUS_PAGE 0x37
  69. #define LOCATE_STATUS_PAGE_LENGTH 0
  70. #define MODE_HEADER_LENGTH 4
  71. /*
  72. * REQUEST SENSE packet command result - Data Format.
  73. */
  74. typedef struct {
  75. unsigned error_code :7; /* Current of deferred errors */
  76. unsigned valid :1; /* The information field conforms to QIC-157C */
  77. u8 reserved1 :8; /* Segment Number - Reserved */
  78. unsigned sense_key :4; /* Sense Key */
  79. unsigned reserved2_4 :1; /* Reserved */
  80. unsigned ili :1; /* Incorrect Length Indicator */
  81. unsigned eom :1; /* End Of Medium */
  82. unsigned filemark :1; /* Filemark */
  83. u32 information __attribute__ ((packed));
  84. u8 asl; /* Additional sense length (n-7) */
  85. u32 command_specific; /* Additional command specific information */
  86. u8 asc; /* Additional Sense Code */
  87. u8 ascq; /* Additional Sense Code Qualifier */
  88. u8 replaceable_unit_code; /* Field Replaceable Unit Code */
  89. unsigned sk_specific1 :7; /* Sense Key Specific */
  90. unsigned sksv :1; /* Sense Key Specific information is valid */
  91. u8 sk_specific2; /* Sense Key Specific */
  92. u8 sk_specific3; /* Sense Key Specific */
  93. u8 pad[2]; /* Padding to 20 bytes */
  94. } idetape_request_sense_result_t;
  95. /*
  96. * Mode Parameter Header for the MODE SENSE packet command
  97. */
  98. typedef struct {
  99. u8 mode_data_length; /* Length of the following data transfer */
  100. u8 medium_type; /* Medium Type */
  101. u8 dsp; /* Device Specific Parameter */
  102. u8 bdl; /* Block Descriptor Length */
  103. } osst_mode_parameter_header_t;
  104. /*
  105. * Mode Parameter Block Descriptor the MODE SENSE packet command
  106. *
  107. * Support for block descriptors is optional.
  108. */
  109. typedef struct {
  110. u8 density_code; /* Medium density code */
  111. u8 blocks[3]; /* Number of blocks */
  112. u8 reserved4; /* Reserved */
  113. u8 length[3]; /* Block Length */
  114. } osst_parameter_block_descriptor_t;
  115. /*
  116. * The Data Compression Page, as returned by the MODE SENSE packet command.
  117. */
  118. typedef struct {
  119. #if defined(__BIG_ENDIAN_BITFIELD)
  120. unsigned ps :1;
  121. unsigned reserved0 :1; /* Reserved */
  122. unsigned page_code :6; /* Page Code - Should be 0xf */
  123. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  124. unsigned page_code :6; /* Page Code - Should be 0xf */
  125. unsigned reserved0 :1; /* Reserved */
  126. unsigned ps :1;
  127. #else
  128. #error "Please fix <asm/byteorder.h>"
  129. #endif
  130. u8 page_length; /* Page Length - Should be 14 */
  131. #if defined(__BIG_ENDIAN_BITFIELD)
  132. unsigned dce :1; /* Data Compression Enable */
  133. unsigned dcc :1; /* Data Compression Capable */
  134. unsigned reserved2 :6; /* Reserved */
  135. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  136. unsigned reserved2 :6; /* Reserved */
  137. unsigned dcc :1; /* Data Compression Capable */
  138. unsigned dce :1; /* Data Compression Enable */
  139. #else
  140. #error "Please fix <asm/byteorder.h>"
  141. #endif
  142. #if defined(__BIG_ENDIAN_BITFIELD)
  143. unsigned dde :1; /* Data Decompression Enable */
  144. unsigned red :2; /* Report Exception on Decompression */
  145. unsigned reserved3 :5; /* Reserved */
  146. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  147. unsigned reserved3 :5; /* Reserved */
  148. unsigned red :2; /* Report Exception on Decompression */
  149. unsigned dde :1; /* Data Decompression Enable */
  150. #else
  151. #error "Please fix <asm/byteorder.h>"
  152. #endif
  153. u32 ca; /* Compression Algorithm */
  154. u32 da; /* Decompression Algorithm */
  155. u8 reserved[4]; /* Reserved */
  156. } osst_data_compression_page_t;
  157. /*
  158. * The Medium Partition Page, as returned by the MODE SENSE packet command.
  159. */
  160. typedef struct {
  161. #if defined(__BIG_ENDIAN_BITFIELD)
  162. unsigned ps :1;
  163. unsigned reserved1_6 :1; /* Reserved */
  164. unsigned page_code :6; /* Page Code - Should be 0x11 */
  165. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  166. unsigned page_code :6; /* Page Code - Should be 0x11 */
  167. unsigned reserved1_6 :1; /* Reserved */
  168. unsigned ps :1;
  169. #else
  170. #error "Please fix <asm/byteorder.h>"
  171. #endif
  172. u8 page_length; /* Page Length - Should be 6 */
  173. u8 map; /* Maximum Additional Partitions - Should be 0 */
  174. u8 apd; /* Additional Partitions Defined - Should be 0 */
  175. #if defined(__BIG_ENDIAN_BITFIELD)
  176. unsigned fdp :1; /* Fixed Data Partitions */
  177. unsigned sdp :1; /* Should be 0 */
  178. unsigned idp :1; /* Should be 0 */
  179. unsigned psum :2; /* Should be 0 */
  180. unsigned reserved4_012 :3; /* Reserved */
  181. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  182. unsigned reserved4_012 :3; /* Reserved */
  183. unsigned psum :2; /* Should be 0 */
  184. unsigned idp :1; /* Should be 0 */
  185. unsigned sdp :1; /* Should be 0 */
  186. unsigned fdp :1; /* Fixed Data Partitions */
  187. #else
  188. #error "Please fix <asm/byteorder.h>"
  189. #endif
  190. u8 mfr; /* Medium Format Recognition */
  191. u8 reserved[2]; /* Reserved */
  192. } osst_medium_partition_page_t;
  193. /*
  194. * Capabilities and Mechanical Status Page
  195. */
  196. typedef struct {
  197. #if defined(__BIG_ENDIAN_BITFIELD)
  198. unsigned reserved1_67 :2;
  199. unsigned page_code :6; /* Page code - Should be 0x2a */
  200. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  201. unsigned page_code :6; /* Page code - Should be 0x2a */
  202. unsigned reserved1_67 :2;
  203. #else
  204. #error "Please fix <asm/byteorder.h>"
  205. #endif
  206. u8 page_length; /* Page Length - Should be 0x12 */
  207. u8 reserved2, reserved3;
  208. #if defined(__BIG_ENDIAN_BITFIELD)
  209. unsigned reserved4_67 :2;
  210. unsigned sprev :1; /* Supports SPACE in the reverse direction */
  211. unsigned reserved4_1234 :4;
  212. unsigned ro :1; /* Read Only Mode */
  213. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  214. unsigned ro :1; /* Read Only Mode */
  215. unsigned reserved4_1234 :4;
  216. unsigned sprev :1; /* Supports SPACE in the reverse direction */
  217. unsigned reserved4_67 :2;
  218. #else
  219. #error "Please fix <asm/byteorder.h>"
  220. #endif
  221. #if defined(__BIG_ENDIAN_BITFIELD)
  222. unsigned reserved5_67 :2;
  223. unsigned qfa :1; /* Supports the QFA two partition formats */
  224. unsigned reserved5_4 :1;
  225. unsigned efmt :1; /* Supports ERASE command initiated formatting */
  226. unsigned reserved5_012 :3;
  227. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  228. unsigned reserved5_012 :3;
  229. unsigned efmt :1; /* Supports ERASE command initiated formatting */
  230. unsigned reserved5_4 :1;
  231. unsigned qfa :1; /* Supports the QFA two partition formats */
  232. unsigned reserved5_67 :2;
  233. #else
  234. #error "Please fix <asm/byteorder.h>"
  235. #endif
  236. #if defined(__BIG_ENDIAN_BITFIELD)
  237. unsigned cmprs :1; /* Supports data compression */
  238. unsigned ecc :1; /* Supports error correction */
  239. unsigned reserved6_45 :2; /* Reserved */
  240. unsigned eject :1; /* The device can eject the volume */
  241. unsigned prevent :1; /* The device defaults in the prevent state after power up */
  242. unsigned locked :1; /* The volume is locked */
  243. unsigned lock :1; /* Supports locking the volume */
  244. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  245. unsigned lock :1; /* Supports locking the volume */
  246. unsigned locked :1; /* The volume is locked */
  247. unsigned prevent :1; /* The device defaults in the prevent state after power up */
  248. unsigned eject :1; /* The device can eject the volume */
  249. unsigned reserved6_45 :2; /* Reserved */
  250. unsigned ecc :1; /* Supports error correction */
  251. unsigned cmprs :1; /* Supports data compression */
  252. #else
  253. #error "Please fix <asm/byteorder.h>"
  254. #endif
  255. #if defined(__BIG_ENDIAN_BITFIELD)
  256. unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
  257. /* transfers for slow buffer memory ??? */
  258. /* Also 32768 block size in some cases */
  259. unsigned reserved7_3_6 :4;
  260. unsigned blk1024 :1; /* Supports 1024 bytes block size */
  261. unsigned blk512 :1; /* Supports 512 bytes block size */
  262. unsigned reserved7_0 :1;
  263. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  264. unsigned reserved7_0 :1;
  265. unsigned blk512 :1; /* Supports 512 bytes block size */
  266. unsigned blk1024 :1; /* Supports 1024 bytes block size */
  267. unsigned reserved7_3_6 :4;
  268. unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
  269. /* transfers for slow buffer memory ??? */
  270. /* Also 32768 block size in some cases */
  271. #else
  272. #error "Please fix <asm/byteorder.h>"
  273. #endif
  274. __be16 max_speed; /* Maximum speed supported in KBps */
  275. u8 reserved10, reserved11;
  276. __be16 ctl; /* Continuous Transfer Limit in blocks */
  277. __be16 speed; /* Current Speed, in KBps */
  278. __be16 buffer_size; /* Buffer Size, in 512 bytes */
  279. u8 reserved18, reserved19;
  280. } osst_capabilities_page_t;
  281. /*
  282. * Block Size Page
  283. */
  284. typedef struct {
  285. #if defined(__BIG_ENDIAN_BITFIELD)
  286. unsigned ps :1;
  287. unsigned reserved1_6 :1;
  288. unsigned page_code :6; /* Page code - Should be 0x30 */
  289. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  290. unsigned page_code :6; /* Page code - Should be 0x30 */
  291. unsigned reserved1_6 :1;
  292. unsigned ps :1;
  293. #else
  294. #error "Please fix <asm/byteorder.h>"
  295. #endif
  296. u8 page_length; /* Page Length - Should be 2 */
  297. u8 reserved2;
  298. #if defined(__BIG_ENDIAN_BITFIELD)
  299. unsigned one :1;
  300. unsigned reserved2_6 :1;
  301. unsigned record32_5 :1;
  302. unsigned record32 :1;
  303. unsigned reserved2_23 :2;
  304. unsigned play32_5 :1;
  305. unsigned play32 :1;
  306. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  307. unsigned play32 :1;
  308. unsigned play32_5 :1;
  309. unsigned reserved2_23 :2;
  310. unsigned record32 :1;
  311. unsigned record32_5 :1;
  312. unsigned reserved2_6 :1;
  313. unsigned one :1;
  314. #else
  315. #error "Please fix <asm/byteorder.h>"
  316. #endif
  317. } osst_block_size_page_t;
  318. /*
  319. * Tape Parameters Page
  320. */
  321. typedef struct {
  322. #if defined(__BIG_ENDIAN_BITFIELD)
  323. unsigned ps :1;
  324. unsigned reserved1_6 :1;
  325. unsigned page_code :6; /* Page code - Should be 0x2b */
  326. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  327. unsigned page_code :6; /* Page code - Should be 0x2b */
  328. unsigned reserved1_6 :1;
  329. unsigned ps :1;
  330. #else
  331. #error "Please fix <asm/byteorder.h>"
  332. #endif
  333. u8 reserved2;
  334. u8 density;
  335. u8 reserved3,reserved4;
  336. __be16 segtrk;
  337. __be16 trks;
  338. u8 reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
  339. } osst_tape_paramtr_page_t;
  340. /* OnStream definitions */
  341. #define OS_CONFIG_PARTITION (0xff)
  342. #define OS_DATA_PARTITION (0)
  343. #define OS_PARTITION_VERSION (1)
  344. /*
  345. * partition
  346. */
  347. typedef struct os_partition_s {
  348. __u8 partition_num;
  349. __u8 par_desc_ver;
  350. __be16 wrt_pass_cntr;
  351. __be32 first_frame_ppos;
  352. __be32 last_frame_ppos;
  353. __be32 eod_frame_ppos;
  354. } os_partition_t;
  355. /*
  356. * DAT entry
  357. */
  358. typedef struct os_dat_entry_s {
  359. __be32 blk_sz;
  360. __be16 blk_cnt;
  361. __u8 flags;
  362. __u8 reserved;
  363. } os_dat_entry_t;
  364. /*
  365. * DAT
  366. */
  367. #define OS_DAT_FLAGS_DATA (0xc)
  368. #define OS_DAT_FLAGS_MARK (0x1)
  369. typedef struct os_dat_s {
  370. __u8 dat_sz;
  371. __u8 reserved1;
  372. __u8 entry_cnt;
  373. __u8 reserved3;
  374. os_dat_entry_t dat_list[16];
  375. } os_dat_t;
  376. /*
  377. * Frame types
  378. */
  379. #define OS_FRAME_TYPE_FILL (0)
  380. #define OS_FRAME_TYPE_EOD (1 << 0)
  381. #define OS_FRAME_TYPE_MARKER (1 << 1)
  382. #define OS_FRAME_TYPE_HEADER (1 << 3)
  383. #define OS_FRAME_TYPE_DATA (1 << 7)
  384. /*
  385. * AUX
  386. */
  387. typedef struct os_aux_s {
  388. __be32 format_id; /* hardware compatibility AUX is based on */
  389. char application_sig[4]; /* driver used to write this media */
  390. __be32 hdwr; /* reserved */
  391. __be32 update_frame_cntr; /* for configuration frame */
  392. __u8 frame_type;
  393. __u8 frame_type_reserved;
  394. __u8 reserved_18_19[2];
  395. os_partition_t partition;
  396. __u8 reserved_36_43[8];
  397. __be32 frame_seq_num;
  398. __be32 logical_blk_num_high;
  399. __be32 logical_blk_num;
  400. os_dat_t dat;
  401. __u8 reserved188_191[4];
  402. __be32 filemark_cnt;
  403. __be32 phys_fm;
  404. __be32 last_mark_ppos;
  405. __u8 reserved204_223[20];
  406. /*
  407. * __u8 app_specific[32];
  408. *
  409. * Linux specific fields:
  410. */
  411. __be32 next_mark_ppos; /* when known, points to next marker */
  412. __be32 last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
  413. __u8 linux_specific[24];
  414. __u8 reserved_256_511[256];
  415. } os_aux_t;
  416. #define OS_FM_TAB_MAX 1024
  417. typedef struct os_fm_tab_s {
  418. __u8 fm_part_num;
  419. __u8 reserved_1;
  420. __u8 fm_tab_ent_sz;
  421. __u8 reserved_3;
  422. __be16 fm_tab_ent_cnt;
  423. __u8 reserved6_15[10];
  424. __be32 fm_tab_ent[OS_FM_TAB_MAX];
  425. } os_fm_tab_t;
  426. typedef struct os_ext_trk_ey_s {
  427. __u8 et_part_num;
  428. __u8 fmt;
  429. __be16 fm_tab_off;
  430. __u8 reserved4_7[4];
  431. __be32 last_hlb_hi;
  432. __be32 last_hlb;
  433. __be32 last_pp;
  434. __u8 reserved20_31[12];
  435. } os_ext_trk_ey_t;
  436. typedef struct os_ext_trk_tb_s {
  437. __u8 nr_stream_part;
  438. __u8 reserved_1;
  439. __u8 et_ent_sz;
  440. __u8 reserved3_15[13];
  441. os_ext_trk_ey_t dat_ext_trk_ey;
  442. os_ext_trk_ey_t qfa_ext_trk_ey;
  443. } os_ext_trk_tb_t;
  444. typedef struct os_header_s {
  445. char ident_str[8];
  446. __u8 major_rev;
  447. __u8 minor_rev;
  448. __be16 ext_trk_tb_off;
  449. __u8 reserved12_15[4];
  450. __u8 pt_par_num;
  451. __u8 pt_reserved1_3[3];
  452. os_partition_t partition[16];
  453. __be32 cfg_col_width;
  454. __be32 dat_col_width;
  455. __be32 qfa_col_width;
  456. __u8 cartridge[16];
  457. __u8 reserved304_511[208];
  458. __be32 old_filemark_list[16680/4]; /* in ADR 1.4 __u8 track_table[16680] */
  459. os_ext_trk_tb_t ext_track_tb;
  460. __u8 reserved17272_17735[464];
  461. os_fm_tab_t dat_fm_tab;
  462. os_fm_tab_t qfa_fm_tab;
  463. __u8 reserved25960_32767[6808];
  464. } os_header_t;
  465. /*
  466. * OnStream ADRL frame
  467. */
  468. #define OS_FRAME_SIZE (32 * 1024 + 512)
  469. #define OS_DATA_SIZE (32 * 1024)
  470. #define OS_AUX_SIZE (512)
  471. //#define OSST_MAX_SG 2
  472. /* The OnStream tape buffer descriptor. */
  473. struct osst_buffer {
  474. unsigned char in_use;
  475. unsigned char dma; /* DMA-able buffer */
  476. int buffer_size;
  477. int buffer_blocks;
  478. int buffer_bytes;
  479. int read_pointer;
  480. int writing;
  481. int midlevel_result;
  482. int syscall_result;
  483. struct osst_request *last_SRpnt;
  484. struct st_cmdstatus cmdstat;
  485. struct rq_map_data map_data;
  486. unsigned char *b_data;
  487. os_aux_t *aux; /* onstream AUX structure at end of each block */
  488. unsigned short use_sg; /* zero or number of s/g segments for this adapter */
  489. unsigned short sg_segs; /* number of segments in s/g list */
  490. unsigned short orig_sg_segs; /* number of segments allocated at first try */
  491. struct scatterlist sg[1]; /* MUST BE last item */
  492. } ;
  493. /* The OnStream tape drive descriptor */
  494. struct osst_tape {
  495. struct scsi_driver *driver;
  496. unsigned capacity;
  497. struct scsi_device *device;
  498. struct mutex lock; /* for serialization */
  499. struct completion wait; /* for SCSI commands */
  500. struct osst_buffer * buffer;
  501. /* Drive characteristics */
  502. unsigned char omit_blklims;
  503. unsigned char do_auto_lock;
  504. unsigned char can_bsr;
  505. unsigned char can_partitions;
  506. unsigned char two_fm;
  507. unsigned char fast_mteom;
  508. unsigned char restr_dma;
  509. unsigned char scsi2_logical;
  510. unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */
  511. unsigned char pos_unknown; /* after reset position unknown */
  512. int write_threshold;
  513. int timeout; /* timeout for normal commands */
  514. int long_timeout; /* timeout for commands known to take long time*/
  515. /* Mode characteristics */
  516. struct st_modedef modes[ST_NBR_MODES];
  517. int current_mode;
  518. /* Status variables */
  519. int partition;
  520. int new_partition;
  521. int nbr_partitions; /* zero until partition support enabled */
  522. struct st_partstat ps[ST_NBR_PARTITIONS];
  523. unsigned char dirty;
  524. unsigned char ready;
  525. unsigned char write_prot;
  526. unsigned char drv_write_prot;
  527. unsigned char in_use;
  528. unsigned char blksize_changed;
  529. unsigned char density_changed;
  530. unsigned char compression_changed;
  531. unsigned char drv_buffer;
  532. unsigned char density;
  533. unsigned char door_locked;
  534. unsigned char rew_at_close;
  535. unsigned char inited;
  536. int block_size;
  537. int min_block;
  538. int max_block;
  539. int recover_count; /* from tape opening */
  540. int abort_count;
  541. int write_count;
  542. int read_count;
  543. int recover_erreg; /* from last status call */
  544. /*
  545. * OnStream specific data
  546. */
  547. int os_fw_rev; /* the firmware revision * 10000 */
  548. unsigned char raw; /* flag OnStream raw access (32.5KB block size) */
  549. unsigned char poll; /* flag that this drive needs polling (IDE|firmware) */
  550. unsigned char frame_in_buffer; /* flag that the frame as per frame_seq_number
  551. * has been read into STp->buffer and is valid */
  552. int frame_seq_number; /* logical frame number */
  553. int logical_blk_num; /* logical block number */
  554. unsigned first_frame_position; /* physical frame to be transferred to/from host */
  555. unsigned last_frame_position; /* physical frame to be transferd to/from tape */
  556. int cur_frames; /* current number of frames in internal buffer */
  557. int max_frames; /* max number of frames in internal buffer */
  558. char application_sig[5]; /* application signature */
  559. unsigned char fast_open; /* flag that reminds us we didn't check headers at open */
  560. unsigned short wrt_pass_cntr; /* write pass counter */
  561. int update_frame_cntr; /* update frame counter */
  562. int onstream_write_error; /* write error recovery active */
  563. int header_ok; /* header frame verified ok */
  564. int linux_media; /* reading linux-specifc media */
  565. int linux_media_version;
  566. os_header_t * header_cache; /* cache is kept for filemark positions */
  567. int filemark_cnt;
  568. int first_mark_ppos;
  569. int last_mark_ppos;
  570. int last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
  571. int first_data_ppos;
  572. int eod_frame_ppos;
  573. int eod_frame_lfa;
  574. int write_type; /* used in write error recovery */
  575. int read_error_frame; /* used in read error recovery */
  576. unsigned long cmd_start_time;
  577. unsigned long max_cmd_time;
  578. #if DEBUG
  579. unsigned char write_pending;
  580. int nbr_finished;
  581. int nbr_waits;
  582. unsigned char last_cmnd[6];
  583. unsigned char last_sense[16];
  584. #endif
  585. struct gendisk *drive;
  586. } ;
  587. /* scsi tape command */
  588. struct osst_request {
  589. unsigned char cmd[MAX_COMMAND_SIZE];
  590. unsigned char sense[SCSI_SENSE_BUFFERSIZE];
  591. int result;
  592. struct osst_tape *stp;
  593. struct completion *waiting;
  594. struct bio *bio;
  595. };
  596. /* Values of write_type */
  597. #define OS_WRITE_DATA 0
  598. #define OS_WRITE_EOD 1
  599. #define OS_WRITE_NEW_MARK 2
  600. #define OS_WRITE_LAST_MARK 3
  601. #define OS_WRITE_HEADER 4
  602. #define OS_WRITE_FILLER 5
  603. /* Additional rw state */
  604. #define OS_WRITING_COMPLETE 3