-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy pathscsitape.h
131 lines (116 loc) · 8.18 KB
/
scsitape.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* SCSITAPE.H (c) Copyright "Fish" (David B. Trout), 2005-2012 */
/* Hercules SCSI tape handling module */
/* */
/* Released under "The Q Public License Version 1" */
/* (http://www.hercules-390.org/herclic.html) as modifications to */
/* Hercules. */
/* Original Author: "Fish" (David B. Trout) */
/* Prime Maintainer: "Fish" (David B. Trout) */
/* Secondary Maintainer: Ivan Warren */
/*-------------------------------------------------------------------*/
/* This module only contains support for SCSI tapes. Please see the */
/* 'tapedev.c' (and possibly other) source module(s) for information */
/* regarding support for other emulated tape/media formats. */
/*-------------------------------------------------------------------*/
#ifndef _SCSITAPE_H_
#define _SCSITAPE_H_
#if defined(OPTION_SCSI_TAPE)
#include "tapedev.h"
#include "w32stape.h"
#include "scsiutil.h"
/*-------------------------------------------------------------------*/
/* External TMH-vector calls */
/*-------------------------------------------------------------------*/
extern int update_status_scsitape ( DEVBLK *dev ); // (via "generic" vector)
extern int open_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int finish_scsitape_open ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern void close_scsitape ( DEVBLK *dev );
extern int read_scsitape ( DEVBLK *dev, BYTE *buf, BYTE *unitstat, BYTE code );
extern int write_scsitape ( DEVBLK *dev, BYTE *buf, U32 len, BYTE *unitstat, BYTE code );
extern int rewind_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int bsb_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int fsb_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int bsf_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int fsf_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int write_scsimark ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int sync_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int dse_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int erg_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int is_tape_mounted_scsitape ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern int passedeot_scsitape ( DEVBLK *dev );
extern int readblkid_scsitape ( DEVBLK* dev, BYTE* logical, BYTE* physical );
extern int locateblk_scsitape ( DEVBLK* dev, U32 blockid, BYTE *unitstat, BYTE code );
/*-------------------------------------------------------------------*/
/* Internal functions */
/*-------------------------------------------------------------------*/
extern void int_scsi_rewind_unload ( DEVBLK *dev, BYTE *unitstat, BYTE code );
extern void int_scsi_status_update ( DEVBLK *dev, int mountstat_only );
extern int int_scsi_status_mounted( DEVBLK *dev, int update_status );
extern int int_write_scsimark ( DEVBLK *dev );
extern void blockid_emulated_to_actual( DEVBLK *dev, BYTE *emu_blkid, BYTE *act_blkid );
extern void blockid_actual_to_emulated( DEVBLK *dev, BYTE *act_blkid, BYTE *emu_blkid );
extern void blockid_32_to_22( BYTE *in_32blkid, BYTE *out_22blkid );
extern void blockid_22_to_32( BYTE *in_22blkid, BYTE *out_32blkid );
extern void create_automount_thread( DEVBLK* dev );
extern void *scsi_tapemountmon_thread( void* notused );
extern void define_BOT_pos( DEVBLK *dev );
/*-------------------------------------------------------------------*/
/* SCSI drive status query timeout */
/*-------------------------------------------------------------------*/
/* */
/* PROGRAMMING NOTE: I'm not sure of what the the actual/proper */
/* value should be (or is) for the following value but I've coded */
/* what seems to me to be a reasonable value for it. */
/* */
/* As you can probably guess based on its [rather verbose] name, */
/* it's the maximum amount of time that a SCSI tape drive status */
/* query should take (i.e. asking the system for the drive status */
/* should not, under normal circumstances, take any longer than */
/* the below defined amount of time, specified in microseconds). */
/* */
/* It should be set to the most reasonable pessimistic value that */
/* we can tolerate, and should probably be at least as long as the */
/* host operating system's thread scheduling time-slice quantum. */
/* */
/* -- Fish, April 2006 */
/*-------------------------------------------------------------------*/
/* */
/* August, 2006: further testing/experimentation has revealed that */
/* the "proper" value (i.e. one that causes the fewest potential */
/* problems) for the below timeout setting varies greatly from one */
/* system to another, with different host CPU speeds and different */
/* hardware (SCSI adapter cards, etc) being the largest factors. */
/* */
/* Thus, in order to try and define it to a value likely to cause */
/* the LEAST number of problems on the largest number of systems, */
/* I am changing it from its original 25 millisecond value to the */
/* EXTREMELY PESSIMISTIC (but nonetheless safe(?), since it is */
/* afterall only a timeout setting) value of 250 milliseconds. */
/* */
/* I've decided to do this because I happened to notice that on */
/* some systems (Windows) with moderate host workload, querying */
/* the status of the tape drive, while *usually* only taking 4-6 */
/* milliseconds maximum, would sometimes take up to 113 or more */
/* milliseconds! (thus sometimes causing the guest to experience */
/* intermittent/sporadic unsolicited ATTN interrupts on the tape */
/* drive as their tape jobs ran (since "not mounted" status was */
/* thus getting set as a result of the status query taking longer */
/* than expected, causing the auto-mount thread to kick-in and */
/* then immediately exit again (with an ATTN interrupt of course) */
/* whenever it eventually noticed a tape was indeed still mounted */
/* on the drive)). */
/* */
/* Thus, even though such unsolicited ATTN interrupts occuring in */
/* the middle of (i.e. during) an already running tape job should */
/* NOT, under ordinary circumstances, cause any problems (as long */
/* as auto-scsi-mount is enabled of course), in order to reduce */
/* the chance of it happening, I am increasing the below timeout */
/* setting to a value that, ideally, *should* work on most *all* */
/* systems, even under the most pessimistic of host workloads. */
/* */
/* -- Fish, August 2006. */
/*-------------------------------------------------------------------*/
// ZZ FIXME: should we maybe make this a config file option??
#define MAX_NORMAL_SCSI_DRIVE_QUERY_RESPONSE_TIMEOUT_USECS (250*1000)
#endif // defined( OPTION_SCSI_TAPE )
#endif // _SCSITAPE_H_