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
|
/* $NetBSD: stvar.h,v 1.26 2018/03/24 08:08:19 mlelstv Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Charles M. Hannum.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Originally written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems for use under the MACH(2.5) operating system.
*
* TRW Financial Systems, in accordance with their agreement with Carnegie
* Mellon University, makes this software available to CMU to distribute
* or use in any manner that they see fit as long as this message is kept with
* the software. For this reason TFS also grants any other persons or
* organisations permission to use or modify this software.
*
* TFS supplies this software to be publicly redistributed
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
* major changes by Julian Elischer (julian@jules.dialix.oz.au) May 1993
*
* A lot of rewhacking done by mjacob (mjacob@nas.nasa.gov).
*/
#include <sys/rndsource.h>
#include <dev/scsipi/scsipi_all.h>
#include <dev/scsipi/scsiconf.h>
#define ST_IO_TIME (3 * 60 * 1000) /* 3 minutes */
#define ST_CTL_TIME (30 * 1000) /* 30 seconds */
#define ST_SPC_TIME (4 * 60 * 60 * 1000) /* 4 hours */
#define ST_RETRIES 4 /* only on non IO commands */
struct modes {
u_int quirks; /* same definitions as in quirkdata */
int blksize;
uint8_t density;
};
struct quirkdata {
u_int quirks;
#define ST_Q_FORCE_BLKSIZE 0x0001
#define ST_Q_SENSE_HELP 0x0002 /* must do READ for good MODE SENSE */
#define ST_Q_IGNORE_LOADS 0x0004
#define ST_Q_BLKSIZE 0x0008 /* variable-block media_blksize > 0 */
#define ST_Q_UNIMODAL 0x0010 /* unimode drive rejects mode select */
#define ST_Q_NOPREVENT 0x0020 /* does not support PREVENT */
#define ST_Q_ERASE_NOIMM 0x0040 /* drive rejects ERASE/w Immed bit */
#define ST_Q_NOFILEMARKS 0x0080 /* can only write 0 filemarks */
u_int page_0_size;
#define MAX_PAGE_0_SIZE 64
struct modes modes[4];
};
struct st_quirk_inquiry_pattern {
struct scsipi_inquiry_pattern pattern;
struct quirkdata quirkdata;
};
struct st_softc {
device_t sc_dev;
/*--------------------callback to bus-specific code--------------------------*/
int (*ops)(struct st_softc *, int, int);
#define ST_OPS_RBL 0x00 /* read block limit */
#define ST_OPS_MODESENSE 0x01 /* mode sense */
#define ST_OPS_MODESELECT 0x02 /* mode select */
#define ST_OPS_CMPRSS_ON 0x03 /* turn on compression */
#define ST_OPS_CMPRSS_OFF 0x04 /* turn off compression */
/*--------------------present operating parameters, flags etc.---------------*/
int flags; /* see below */
u_int quirks; /* quirks for the open mode */
int blksize; /* blksize we are using */
uint8_t density; /* present density */
u_int page_0_size; /* size of page 0 data */
u_int last_dsty; /* last density opened */
short mt_resid; /* last (short) resid */
short mt_erreg; /* last error (sense key) seen */
/* relative to BOT location */
daddr_t fileno;
daddr_t blkno;
int32_t last_io_resid;
int32_t last_ctl_resid;
#define mt_key mt_erreg
uint8_t asc; /* last asc code seen */
uint8_t ascq; /* last asc code seen */
/*--------------------device/scsi parameters---------------------------------*/
struct scsipi_periph *sc_periph;/* our link to the adpter etc. */
/*--------------------parameters reported by the device ---------------------*/
int blkmin; /* min blk size */
int blkmax; /* max blk size */
const struct quirkdata *quirkdata; /* if we have a rogue entry */
/*--------------------parameters reported by the device for this media-------*/
u_long numblks; /* nominal blocks capacity */
int media_blksize; /* 0 if not ST_FIXEDBLOCKS */
uint8_t media_density; /* this is what it said when asked */
/*--------------------quirks for the whole drive-----------------------------*/
u_int drive_quirks; /* quirks of this drive */
/*--------------------How we should set up when opening each minor device----*/
struct modes modes[4]; /* plus more for each mode */
uint8_t modeflags[4]; /* flags for the modes */
#define DENSITY_SET_BY_USER 0x01
#define DENSITY_SET_BY_QUIRK 0x02
#define BLKSIZE_SET_BY_USER 0x04
#define BLKSIZE_SET_BY_QUIRK 0x08
/*--------------------storage for sense data returned by the drive-----------*/
u_char sense_data[MAX_PAGE_0_SIZE]; /*
* additional sense data needed
* for mode sense/select.
*/
struct bufq_state *buf_queue; /* the queue of pending IO */
/* operations */
struct bufq_state *buf_defer; /* the queue of deferred IO */
/* operations */
struct callout sc_callout; /* restarting the queue after */
/* transient error */
struct io_stats *stats; /* statistics for the drive */
krndsource_t rnd_source;
kmutex_t sc_iolock;
};
#define ST_INFO_VALID 0x0001
#define ST_BLOCK_SET 0x0002 /* block size, mode set by ioctl */
#define ST_WRITTEN 0x0004 /* data has been written, EOD needed */
#define ST_FIXEDBLOCKS 0x0008
#define ST_AT_FILEMARK 0x0010
#define ST_EIO_PENDING 0x0020 /* error reporting deferred until next op */
#define ST_NEW_MOUNT 0x0040 /* still need to decide mode */
#define ST_READONLY 0x0080 /* st_mode_sense says write protected */
#define ST_FM_WRITTEN 0x0100 /*
* EOF file mark written -- used with
* ~ST_WRITTEN to indicate that multiple file
* marks have been written
*/
#define ST_BLANK_READ 0x0200 /* BLANK CHECK encountered already */
#define ST_2FM_AT_EOD 0x0400 /* write 2 file marks at EOD */
#define ST_MOUNTED 0x0800 /* Device is presently mounted */
#define ST_DONTBUFFER 0x1000 /* Disable buffering/caching */
#define ST_EARLYWARN 0x2000 /* Do (deferred) EOM for variable mode */
#define ST_EOM_PENDING 0x4000 /* EOM reporting deferred until next op */
#define ST_POSUPDATED 0x8000 /* tape position already updated */
#define ST_PER_ACTION (ST_AT_FILEMARK | ST_EIO_PENDING | ST_EOM_PENDING | \
ST_BLANK_READ)
#define ST_PER_MOUNT (ST_INFO_VALID | ST_BLOCK_SET | ST_WRITTEN | \
ST_FIXEDBLOCKS | ST_READONLY | ST_FM_WRITTEN | \
ST_2FM_AT_EOD | ST_PER_ACTION | ST_POSUPDATED)
void stattach(device_t, device_t, void *);
int stdetach(device_t, int);
int st_mode_select(struct st_softc *, int);
extern struct cfdriver st_cd;
|