Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
s390
char
tape.h
Go to the documentation of this file.
1
/*
2
* tape device driver for 3480/3490E/3590 tapes.
3
*
4
* S390 and zSeries version
5
* Copyright IBM Corp. 2001, 2009
6
* Author(s): Carsten Otte <
[email protected]
>
7
* Tuan Ngo-Anh <
[email protected]
>
8
* Martin Schwidefsky <
[email protected]
>
9
* Stefan Bader <
[email protected]
>
10
*/
11
12
#ifndef _TAPE_H
13
#define _TAPE_H
14
15
#include <
asm/ccwdev.h
>
16
#include <asm/debug.h>
17
#include <
asm/idals.h
>
18
#include <linux/kernel.h>
19
#include <linux/module.h>
20
#include <
linux/mtio.h
>
21
#include <
linux/interrupt.h
>
22
#include <
linux/workqueue.h
>
23
24
struct
gendisk;
25
26
/*
27
* Define DBF_LIKE_HELL for lots of messages in the debug feature.
28
*/
29
#define DBF_LIKE_HELL
30
#ifdef DBF_LIKE_HELL
31
#define DBF_LH(level, str, ...) \
32
do { \
33
debug_sprintf_event(TAPE_DBF_AREA, level, str, ## __VA_ARGS__); \
34
} while (0)
35
#else
36
#define DBF_LH(level, str, ...) do {} while(0)
37
#endif
38
39
/*
40
* macros s390 debug feature (dbf)
41
*/
42
#define DBF_EVENT(d_level, d_str...) \
43
do { \
44
debug_sprintf_event(TAPE_DBF_AREA, d_level, d_str); \
45
} while (0)
46
47
#define DBF_EXCEPTION(d_level, d_str...) \
48
do { \
49
debug_sprintf_exception(TAPE_DBF_AREA, d_level, d_str); \
50
} while (0)
51
52
#define TAPE_VERSION_MAJOR 2
53
#define TAPE_VERSION_MINOR 0
54
#define TAPE_MAGIC "tape"
55
56
#define TAPE_MINORS_PER_DEV 2
/* two minors per device */
57
#define TAPEBLOCK_HSEC_SIZE 2048
58
#define TAPEBLOCK_HSEC_S2B 2
59
#define TAPEBLOCK_RETRIES 5
60
61
enum
tape_medium_state
{
62
MS_UNKNOWN
,
63
MS_LOADED
,
64
MS_UNLOADED
,
65
MS_SIZE
66
};
67
68
enum
tape_state
{
69
TS_UNUSED
=0,
70
TS_IN_USE
,
71
TS_BLKUSE
,
72
TS_INIT
,
73
TS_NOT_OPER
,
74
TS_SIZE
75
};
76
77
enum
tape_op
{
78
TO_BLOCK
,
/* Block read */
79
TO_BSB
,
/* Backward space block */
80
TO_BSF
,
/* Backward space filemark */
81
TO_DSE
,
/* Data security erase */
82
TO_FSB
,
/* Forward space block */
83
TO_FSF
,
/* Forward space filemark */
84
TO_LBL
,
/* Locate block label */
85
TO_NOP
,
/* No operation */
86
TO_RBA
,
/* Read backward */
87
TO_RBI
,
/* Read block information */
88
TO_RFO
,
/* Read forward */
89
TO_REW
,
/* Rewind tape */
90
TO_RUN
,
/* Rewind and unload tape */
91
TO_WRI
,
/* Write block */
92
TO_WTM
,
/* Write tape mark */
93
TO_MSEN
,
/* Medium sense */
94
TO_LOAD
,
/* Load tape */
95
TO_READ_CONFIG
,
/* Read configuration data */
96
TO_READ_ATTMSG
,
/* Read attention message */
97
TO_DIS
,
/* Tape display */
98
TO_ASSIGN
,
/* Assign tape to channel path */
99
TO_UNASSIGN
,
/* Unassign tape from channel path */
100
TO_CRYPT_ON
,
/* Enable encrpytion */
101
TO_CRYPT_OFF
,
/* Disable encrpytion */
102
TO_KEKL_SET
,
/* Set KEK label */
103
TO_KEKL_QUERY
,
/* Query KEK label */
104
TO_RDC
,
/* Read device characteristics */
105
TO_SIZE
,
/* #entries in tape_op_t */
106
};
107
108
/* Forward declaration */
109
struct
tape_device
;
110
111
/* tape_request->status can be: */
112
enum
tape_request_status
{
113
TAPE_REQUEST_INIT
,
/* request is ready to be processed */
114
TAPE_REQUEST_QUEUED
,
/* request is queued to be processed */
115
TAPE_REQUEST_IN_IO
,
/* request is currently in IO */
116
TAPE_REQUEST_DONE
,
/* request is completed. */
117
TAPE_REQUEST_CANCEL
,
/* request should be canceled. */
118
TAPE_REQUEST_LONG_BUSY
,
/* request has to be restarted after long busy */
119
};
120
121
/* Tape CCW request */
122
struct
tape_request
{
123
struct
list_head
list
;
/* list head for request queueing. */
124
struct
tape_device
*
device
;
/* tape device of this request */
125
struct
ccw1
*
cpaddr
;
/* address of the channel program. */
126
void
*
cpdata
;
/* pointer to ccw data. */
127
enum
tape_request_status
status
;
/* status of this request */
128
int
options
;
/* options for execution. */
129
int
retries
;
/* retry counter for error recovery. */
130
int
rescnt
;
/* residual count from devstat. */
131
132
/* Callback for delivering final status. */
133
void
(*
callback
)(
struct
tape_request
*,
void
*);
134
void
*
callback_data
;
135
136
enum
tape_op
op
;
137
int
rc
;
138
};
139
140
/* Function type for magnetic tape commands */
141
typedef
int
(*
tape_mtop_fn
)(
struct
tape_device
*,
int
);
142
143
/* Size of the array containing the mtops for a discipline */
144
#define TAPE_NR_MTOPS (MTMKPART+1)
145
146
/* Tape Discipline */
147
struct
tape_discipline
{
148
struct
module
*
owner
;
149
int
(*
setup_device
)(
struct
tape_device
*);
150
void
(*
cleanup_device
)(
struct
tape_device
*);
151
int
(*
irq
)(
struct
tape_device
*,
struct
tape_request
*,
struct
irb
*);
152
struct
tape_request
*(*read_block)(
struct
tape_device
*,
size_t
);
153
struct
tape_request
*(*write_block)(
struct
tape_device
*,
size_t
);
154
void
(*
process_eov
)(
struct
tape_device
*);
155
/* ioctl function for additional ioctls. */
156
int
(*
ioctl_fn
)(
struct
tape_device
*,
unsigned
int
,
unsigned
long
);
157
/* Array of tape commands with TAPE_NR_MTOPS entries */
158
tape_mtop_fn
*
mtop_array
;
159
};
160
161
/*
162
* The discipline irq function either returns an error code (<0) which
163
* means that the request has failed with an error or one of the following:
164
*/
165
#define TAPE_IO_SUCCESS 0
/* request successful */
166
#define TAPE_IO_PENDING 1
/* request still running */
167
#define TAPE_IO_RETRY 2
/* retry to current request */
168
#define TAPE_IO_STOP 3
/* stop the running request */
169
#define TAPE_IO_LONG_BUSY 4
/* delay the running request */
170
171
/* Char Frontend Data */
172
struct
tape_char_data
{
173
struct
idal_buffer
*
idal_buf
;
/* idal buffer for user char data */
174
int
block_size
;
/* of size block_size. */
175
};
176
177
/* Tape Info */
178
struct
tape_device
{
179
/* entry in tape_device_list */
180
struct
list_head
node
;
181
182
int
cdev_id
;
183
struct
ccw_device
*
cdev
;
184
struct
tape_class_device
*
nt
;
185
struct
tape_class_device
*
rt
;
186
187
/* Device mutex to serialize tape commands. */
188
struct
mutex
mutex
;
189
190
/* Device discipline information. */
191
struct
tape_discipline
*
discipline
;
192
void
*
discdata
;
193
194
/* Generic status flags */
195
long
tape_generic_status
;
196
197
/* Device state information. */
198
wait_queue_head_t
state_change_wq
;
199
enum
tape_state
tape_state
;
200
enum
tape_medium_state
medium_state
;
201
unsigned
char
*
modeset_byte
;
202
203
/* Reference count. */
204
atomic_t
ref_count
;
205
206
/* Request queue. */
207
struct
list_head
req_queue
;
208
209
/* Request wait queue. */
210
wait_queue_head_t
wait_queue
;
211
212
/* Each tape device has (currently) two minor numbers. */
213
int
first_minor
;
214
215
/* Number of tapemarks required for correct termination. */
216
int
required_tapemarks
;
217
218
/* Block ID of the BOF */
219
unsigned
int
bof
;
220
221
/* Character device frontend data */
222
struct
tape_char_data
char_data
;
223
224
/* Function to start or stop the next request later. */
225
struct
delayed_work
tape_dnr
;
226
227
/* Timer for long busy */
228
struct
timer_list
lb_timeout
;
229
230
};
231
232
/* Externals from tape_core.c */
233
extern
struct
tape_request
*
tape_alloc_request
(
int
cplength,
int
datasize);
234
extern
void
tape_free_request
(
struct
tape_request
*);
235
extern
int
tape_do_io
(
struct
tape_device
*,
struct
tape_request
*);
236
extern
int
tape_do_io_async
(
struct
tape_device
*,
struct
tape_request
*);
237
extern
int
tape_do_io_interruptible
(
struct
tape_device
*,
struct
tape_request
*);
238
extern
int
tape_cancel_io
(
struct
tape_device
*,
struct
tape_request
*);
239
void
tape_hotplug_event
(
struct
tape_device
*,
int
major,
int
action
);
240
241
static
inline
int
242
tape_do_io_free(
struct
tape_device
*
device
,
struct
tape_request
*
request
)
243
{
244
int
rc
;
245
246
rc =
tape_do_io
(device, request);
247
tape_free_request
(request);
248
return
rc
;
249
}
250
251
static
inline
void
252
tape_do_io_async_free(
struct
tape_device
*
device
,
struct
tape_request
*
request
)
253
{
254
request->
callback
= (
void
*)
tape_free_request
;
255
request->
callback_data
=
NULL
;
256
tape_do_io_async
(device, request);
257
}
258
259
extern
int
tape_oper_handler
(
int
irq,
int
status
);
260
extern
void
tape_noper_handler
(
int
irq,
int
status
);
261
extern
int
tape_open
(
struct
tape_device
*);
262
extern
int
tape_release
(
struct
tape_device
*);
263
extern
int
tape_mtop
(
struct
tape_device
*,
int
,
int
);
264
extern
void
tape_state_set
(
struct
tape_device
*,
enum
tape_state
);
265
266
extern
int
tape_generic_online
(
struct
tape_device
*,
struct
tape_discipline
*);
267
extern
int
tape_generic_offline
(
struct
ccw_device
*);
268
extern
int
tape_generic_pm_suspend
(
struct
ccw_device
*);
269
270
/* Externals from tape_devmap.c */
271
extern
int
tape_generic_probe
(
struct
ccw_device
*);
272
extern
void
tape_generic_remove
(
struct
ccw_device
*);
273
274
extern
struct
tape_device
*
tape_find_device
(
int
devindex);
275
extern
struct
tape_device
*
tape_get_device
(
struct
tape_device
*);
276
extern
void
tape_put_device
(
struct
tape_device
*);
277
278
/* Externals from tape_char.c */
279
extern
int
tapechar_init
(
void
);
280
extern
void
tapechar_exit
(
void
);
281
extern
int
tapechar_setup_device
(
struct
tape_device
*);
282
extern
void
tapechar_cleanup_device
(
struct
tape_device
*);
283
284
/* tape initialisation functions */
285
#ifdef CONFIG_PROC_FS
286
extern
void
tape_proc_init
(
void
);
287
extern
void
tape_proc_cleanup
(
void
);
288
#else
289
static
inline
void
tape_proc_init
(
void
) {;}
290
static
inline
void
tape_proc_cleanup
(
void
) {;}
291
#endif
292
293
/* a function for dumping device sense info */
294
extern
void
tape_dump_sense_dbf
(
struct
tape_device
*,
struct
tape_request
*,
295
struct
irb
*);
296
297
/* functions for handling the status of a device */
298
extern
void
tape_med_state_set
(
struct
tape_device
*,
enum
tape_medium_state
);
299
300
/* The debug area */
301
extern
debug_info_t
*
TAPE_DBF_AREA
;
302
303
/* functions for building ccws */
304
static
inline
struct
ccw1
*
305
tape_ccw_cc(
struct
ccw1
*
ccw
,
__u8
cmd_code
,
__u16
memsize
,
void
*
cda
)
306
{
307
ccw->
cmd_code
=
cmd_code
;
308
ccw->
flags
=
CCW_FLAG_CC
;
309
ccw->
count
=
memsize
;
310
ccw->
cda
= (
__u32
)(
addr_t
)
cda
;
311
return
ccw + 1;
312
}
313
314
static
inline
struct
ccw1
*
315
tape_ccw_end(
struct
ccw1
*ccw,
__u8
cmd_code,
__u16
memsize,
void
*cda)
316
{
317
ccw->
cmd_code
=
cmd_code
;
318
ccw->
flags
= 0;
319
ccw->
count
=
memsize
;
320
ccw->
cda
= (
__u32
)(
addr_t
)
cda
;
321
return
ccw + 1;
322
}
323
324
static
inline
struct
ccw1
*
325
tape_ccw_cmd(
struct
ccw1
*ccw,
__u8
cmd_code)
326
{
327
ccw->
cmd_code
=
cmd_code
;
328
ccw->
flags
= 0;
329
ccw->
count
= 0;
330
ccw->
cda
= (
__u32
)(
addr_t
) &ccw->
cmd_code
;
331
return
ccw + 1;
332
}
333
334
static
inline
struct
ccw1
*
335
tape_ccw_repeat(
struct
ccw1
*ccw,
__u8
cmd_code,
int
count
)
336
{
337
while
(count-- > 0) {
338
ccw->
cmd_code
=
cmd_code
;
339
ccw->
flags
=
CCW_FLAG_CC
;
340
ccw->
count
= 0;
341
ccw->
cda
= (
__u32
)(
addr_t
) &ccw->
cmd_code
;
342
ccw++;
343
}
344
return
ccw
;
345
}
346
347
static
inline
struct
ccw1
*
348
tape_ccw_cc_idal(
struct
ccw1
*ccw,
__u8
cmd_code,
struct
idal_buffer
*idal)
349
{
350
ccw->
cmd_code
=
cmd_code
;
351
ccw->
flags
=
CCW_FLAG_CC
;
352
idal_buffer_set_cda(idal, ccw);
353
return
ccw++;
354
}
355
356
static
inline
struct
ccw1
*
357
tape_ccw_end_idal(
struct
ccw1
*ccw,
__u8
cmd_code,
struct
idal_buffer
*idal)
358
{
359
ccw->
cmd_code
=
cmd_code
;
360
ccw->
flags
= 0;
361
idal_buffer_set_cda(idal, ccw);
362
return
ccw++;
363
}
364
365
/* Global vars */
366
extern
const
char
*
tape_state_verbose
[];
367
extern
const
char
*
tape_op_verbose
[];
368
369
#endif
/* for ifdef tape.h */
Generated on Thu Jan 10 2013 14:17:33 for Linux Kernel by
1.8.2