aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/qic117.h
blob: 07b537e5d35949ad583100399b15b3fcdd6842c3 (plain) (blame)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
#ifndef _QIC117_H
#define _QIC117_H

/*
 *      Copyright (C) 1993-1996 Bas Laarhoven,
 *                (C) 1997      Claus-Justus Heine.

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

 *
 * $Source: /homes/cvs/ftape-stacked/include/linux/qic117.h,v $
 * $Revision: 1.2 $
 * $Date: 1997/10/05 19:19:32 $
 *
 *      This file contains QIC-117 spec. related definitions for the
 *      QIC-40/80/3010/3020 floppy-tape driver "ftape" for Linux.
 *
 *      These data were taken from the Quarter-Inch Cartridge
 *      Drive Standards, Inc. document titled:
 *      `Common Command Set Interface Specification for Flexible
 *       Disk Controller Based Minicartridge Tape Drives'
 *       document QIC-117 Revision J, 28 Aug 96.
 *      For more information, contact:
 *       Quarter-Inch Cartridge Drive Standards, Inc.
 *       311 East Carrillo Street
 *       Santa Barbara, California 93101
 *       Telephone (805) 963-3853
 *       Fax       (805) 962-1541
 *       WWW       http://www.qic.org
 *
 *      Current QIC standard revisions (of interest) are:
 *       QIC-40-MC,   Rev. M,  2 Sep 92.
 *       QIC-80-MC,   Rev. N, 20 Mar 96.
 *       QIC-80-MC,   Rev. K, 15 Dec 94.
 *       QIC-113,     Rev. G, 15 Jun 95.
 *       QIC-117,     Rev. J, 28 Aug 96.
 *       QIC-122,     Rev. B,  6 Mar 91.
 *       QIC-130,     Rev. C,  2 Sep 92.
 *       QIC-3010-MC, Rev. F, 14 Jun 95.
 *       QIC-3020-MC, Rev. G, 31 Aug 95.
 *       QIC-CRF3,    Rev. B, 15 Jun 95.
 * */

/*
 *      QIC-117 common command set rev. J.
 *      These commands are sent to the tape unit
 *      as number of pulses over the step line.
 */

typedef enum {
	QIC_NO_COMMAND                  = 0,
	QIC_RESET 			= 1,
	QIC_REPORT_NEXT_BIT		= 2,
	QIC_PAUSE 			= 3,
	QIC_MICRO_STEP_PAUSE		= 4,
	QIC_ALTERNATE_TIMEOUT		= 5,
	QIC_REPORT_DRIVE_STATUS		= 6,
	QIC_REPORT_ERROR_CODE		= 7,
	QIC_REPORT_DRIVE_CONFIGURATION	= 8,
	QIC_REPORT_ROM_VERSION		= 9,
	QIC_LOGICAL_FORWARD		= 10,
	QIC_PHYSICAL_REVERSE		= 11,
	QIC_PHYSICAL_FORWARD		= 12,
	QIC_SEEK_HEAD_TO_TRACK		= 13,
	QIC_SEEK_LOAD_POINT		= 14,
	QIC_ENTER_FORMAT_MODE		= 15,
	QIC_WRITE_REFERENCE_BURST	= 16,
	QIC_ENTER_VERIFY_MODE		= 17,
	QIC_STOP_TAPE			= 18,
/* commands 19-20: reserved */
	QIC_MICRO_STEP_HEAD_UP		= 21,
	QIC_MICRO_STEP_HEAD_DOWN	= 22,
	QIC_SOFT_SELECT			= 23,
	QIC_SOFT_DESELECT		= 24,
	QIC_SKIP_REVERSE		= 25,
	QIC_SKIP_FORWARD		= 26,
	QIC_SELECT_RATE			= 27,
/* command 27, in ccs2: Select Rate or Format */
	QIC_ENTER_DIAGNOSTIC_1		= 28,
	QIC_ENTER_DIAGNOSTIC_2		= 29,
	QIC_ENTER_PRIMARY_MODE		= 30,
/* command 31: vendor unique */
	QIC_REPORT_VENDOR_ID		= 32,
	QIC_REPORT_TAPE_STATUS		= 33,
	QIC_SKIP_EXTENDED_REVERSE	= 34,
	QIC_SKIP_EXTENDED_FORWARD	= 35,
	QIC_CALIBRATE_TAPE_LENGTH	= 36,
	QIC_REPORT_FORMAT_SEGMENTS	= 37,
	QIC_SET_FORMAT_SEGMENTS		= 38,
/* commands 39-45: reserved */
	QIC_PHANTOM_SELECT		= 46,
	QIC_PHANTOM_DESELECT		= 47
} qic117_cmd_t;

typedef enum {
	discretional = 0, required, ccs1, ccs2
} qic_compatibility;

typedef enum {
	unused, mode, motion, report
} command_types;

struct qic117_command_table {
	char *name;
	__u8 mask;
	__u8 state;
	__u8 cmd_type;
	__u8 non_intr;
	__u8 level;
};

#define QIC117_COMMANDS {\
/* command                           mask  state cmd_type           */\
/* |    name                         |     |     |       non_intr   */\
/* |    |                            |     |     |       |  level   */\
/* 0*/ {NULL,                        0x00, 0x00, mode,   0, discretional},\
/* 1*/ {"soft reset",                0x00, 0x00, motion, 1, required},\
/* 2*/ {"report next bit",           0x00, 0x00, report, 0, required},\
/* 3*/ {"pause",                     0x36, 0x24, motion, 1, required},\
/* 4*/ {"micro step pause",          0x36, 0x24, motion, 1, required},\
/* 5*/ {"alternate command timeout", 0x00, 0x00, mode,   0, required},\
/* 6*/ {"report drive status",       0x00, 0x00, report, 0, required},\
/* 7*/ {"report error code",         0x01, 0x01, report, 0, required},\
/* 8*/ {"report drive configuration",0x00, 0x00, report, 0, required},\
/* 9*/ {"report rom version",        0x00, 0x00, report, 0, required},\
/*10*/ {"logical forward",           0x37, 0x25, motion, 0, required},\
/*11*/ {"physical reverse",          0x17, 0x05, motion, 0, required},\
/*12*/ {"physical forward",          0x17, 0x05, motion, 0, required},\
/*13*/ {"seek head to track",        0x37, 0x25, motion, 0, required},\
/*14*/ {"seek load point",           0x17, 0x05, motion, 1, required},\
/*15*/ {"enter format mode",         0x1f, 0x05, mode,   0, required},\
/*16*/ {"write reference burst",     0x1f, 0x05, motion, 1, required},\
/*17*/ {"enter verify mode",         0x37, 0x25, mode,   0, required},\
/*18*/ {"stop tape",                 0x00, 0x00, motion, 1, required},\
/*19*/ {"reserved (19)",             0x00, 0x00, unused, 0, discretional},\
/*20*/ {"reserved (20)",             0x00, 0x00, unused, 0, discretional},\
/*21*/ {"micro step head up",        0x02, 0x00, motion, 0, required},\
/*22*/ {"micro step head down",      0x02, 0x00, motion, 0, required},\
/*23*/ {"soft select",               0x00, 0x00, mode,   0, discretional},\
/*24*/ {"soft deselect",             0x00, 0x00, mode,   0, discretional},\
/*25*/ {"skip segments reverse",     0x36, 0x24, motion, 1, required},\
/*26*/ {"skip segments forward",     0x36, 0x24, motion, 1, required},\
/*27*/ {"select rate or format",     0x03, 0x01, mode,   0, required /* [ccs2] */},\
/*28*/ {"enter diag mode 1",         0x00, 0x00, mode,   0, discretional},\
/*29*/ {"enter diag mode 2",         0x00, 0x00, mode,   0, discretional},\
/*30*/ {"enter primary mode",        0x00, 0x00, mode,   0, required},\
/*31*/ {"vendor unique (31)",        0x00, 0x00, unused, 0, discretional},\
/*32*/ {"report vendor id",          0x00, 0x00, report, 0, required},\
/*33*/ {"report tape status",        0x04, 0x04, report, 0, ccs1},\
/*34*/ {"skip extended reverse",     0x36, 0x24, motion, 1, ccs1},\
/*35*/ {"skip extended forward",     0x36, 0x24, motion, 1, ccs1},\
/*36*/ {"calibrate tape length",     0x17, 0x05, motion, 1, ccs2},\
/*37*/ {"report format segments",    0x17, 0x05, report, 0, ccs2},\
/*38*/ {"set format segments",       0x17, 0x05, mode,   0, ccs2},\
/*39*/ {"reserved (39)",             0x00, 0x00, unused, 0, discretional},\
/*40*/ {"vendor unique (40)",        0x00, 0x00, unused, 0, discretional},\
/*41*/ {"vendor unique (41)",        0x00, 0x00, unused, 0, discretional},\
/*42*/ {"vendor unique (42)",        0x00, 0x00, unused, 0, discretional},\
/*43*/ {"vendor unique (43)",        0x00, 0x00, unused, 0, discretional},\
/*44*/ {"vendor unique (44)",        0x00, 0x00, unused, 0, discretional},\
/*45*/ {"vendor unique (45)",        0x00, 0x00, unused, 0, discretional},\
/*46*/ {"phantom select",            0x00, 0x00, mode,   0, discretional},\
/*47*/ {"phantom deselect",          0x00, 0x00, mode,   0, discretional},\
}

/*
 *      Status bits returned by QIC_REPORT_DRIVE_STATUS
 */

#define QIC_STATUS_READY	0x01	/* Drive is ready or idle. */
#define QIC_STATUS_ERROR	0x02	/* Error detected, must read
					   error code to clear this */
#define QIC_STATUS_CARTRIDGE_PRESENT 0x04	/* Tape is present */
#define QIC_STATUS_WRITE_PROTECT 0x08	/* Tape is write protected */
#define QIC_STATUS_NEW_CARTRIDGE 0x10	/* New cartridge inserted, must
					   read error status to clear. */
#define QIC_STATUS_REFERENCED	0x20	/* Cartridge appears to have been
					   formatted. */
#define QIC_STATUS_AT_BOT	0x40	/* Cartridge is at physical
					   beginning of tape. */
#define QIC_STATUS_AT_EOT	0x80	/* Cartridge is at physical end
					   of tape. */
/*
 *      Status bits returned by QIC_REPORT_DRIVE_CONFIGURATION
 */

#define QIC_CONFIG_RATE_MASK	0x18
#define QIC_CONFIG_RATE_SHIFT	3
#define QIC_CONFIG_RATE_250	0
#define QIC_CONFIG_RATE_500	2
#define QIC_CONFIG_RATE_1000	3
#define QIC_CONFIG_RATE_2000	1
#define QIC_CONFIG_RATE_4000    0       /* since QIC-117 Rev. J */

#define QIC_CONFIG_LONG		0x40	/* Extra Length Tape Detected */
#define QIC_CONFIG_80		0x80	/* QIC-80 detected. */

/*
 *      Status bits returned by QIC_REPORT_TAPE_STATUS
 */

#define QIC_TAPE_STD_MASK       0x0f
#define QIC_TAPE_QIC40  	0x01
#define QIC_TAPE_QIC80  	0x02
#define QIC_TAPE_QIC3020  	0x03
#define QIC_TAPE_QIC3010  	0x04

#define QIC_TAPE_LEN_MASK	0x70
#define QIC_TAPE_205FT		0x10
#define QIC_TAPE_307FT		0x20
#define QIC_TAPE_VARIABLE	0x30
#define QIC_TAPE_1100FT		0x40
#define QIC_TAPE_FLEX		0x60

#define QIC_TAPE_WIDE		0x80

/* Define a value (in feet) slightly higher than 
 * the possible maximum tape length.
 */
#define QIC_TOP_TAPE_LEN	1500

/*
 *      Errors: List of error codes, and their severity.
 */

typedef struct {
	char *message;		/* Text describing the error. */
	unsigned int fatal:1;	/* Non-zero if the error is fatal. */
} ftape_error;

#define QIC117_ERRORS {\
  /* 0*/ { "No error", 0, },\
  /* 1*/ { "Command Received while Drive Not Ready", 0, },\
  /* 2*/ { "Cartridge Not Present or Removed", 1, },\
  /* 3*/ { "Motor Speed Error (not within 1%)", 1, },\
  /* 4*/ { "Motor Speed Fault (jammed, or gross speed error", 1, },\
  /* 5*/ { "Cartridge Write Protected", 1, },\
  /* 6*/ { "Undefined or Reserved Command Code", 1, },\
  /* 7*/ { "Illegal Track Address Specified for Seek", 1, },\
  /* 8*/ { "Illegal Command in Report Subcontext", 0, },\
  /* 9*/ { "Illegal Entry into a Diagnostic Mode", 1, },\
  /*10*/ { "Broken Tape Detected (based on hole sensor)", 1, },\
  /*11*/ { "Warning--Read Gain Setting Error", 1, },\
  /*12*/ { "Command Received While Error Status Pending (obs)", 1, },\
  /*13*/ { "Command Received While New Cartridge Pending", 1, },\
  /*14*/ { "Command Illegal or Undefined in Primary Mode", 1, },\
  /*15*/ { "Command Illegal or Undefined in Format Mode", 1, },\
  /*16*/ { "Command Illegal or Undefined in Verify Mode", 1, },\
  /*17*/ { "Logical Forward Not at Logical BOT or no Format Segments in Format Mode", 1, },\
  /*18*/ { "Logical EOT Before All Segments generated", 1, },\
  /*19*/ { "Command Illegal When Cartridge Not Referenced", 1, },\
  /*20*/ { "Self-Diagnostic Failed (cannot be cleared)", 1, },\
  /*21*/ { "Warning EEPROM Not Initialized, Defaults Set", 1, },\
  /*22*/ { "EEPROM Corrupted or Hardware Failure", 1, },\
  /*23*/ { "Motion Time-out Error", 1, },\
  /*24*/ { "Data Segment Too Long -- Logical Forward or Pause", 1, },\
  /*25*/ { "Transmit Overrun (obs)", 1, },\
  /*26*/ { "Power On Reset Occurred", 0, },\
  /*27*/ { "Software Reset Occurred", 0, },\
  /*28*/ { "Diagnostic Mode 1 Error", 1, },\
  /*29*/ { "Diagnostic Mode 2 Error", 1, },\
  /*30*/ { "Command Received During Non-Interruptible Process", 1, },\
  /*31*/ { "Rate or Format Selection Error", 1, },\
  /*32*/ { "Illegal Command While in High Speed Mode", 1, },\
  /*33*/ { "Illegal Seek Segment Value", 1, },\
  /*34*/ { "Invalid Media", 1, },\
  /*35*/ { "Head Positioning Failure", 1, },\
  /*36*/ { "Write Reference Burst Failure", 1, },\
  /*37*/ { "Prom Code Missing", 1, },\
  /*38*/ { "Invalid Format", 1, },\
  /*39*/ { "EOT/BOT System Failure", 1, },\
  /*40*/ { "Prom A Checksum Error", 1, },\
  /*41*/ { "Drive Wakeup Reset Occurred", 1, },\
  /*42*/ { "Prom B Checksum Error", 1, },\
  /*43*/ { "Illegal Entry into Format Mode", 1, },\
}

#endif				/* _QIC117_H */