st_atapi.c revision 1.2 1 /* $NetBSD: st_atapi.c,v 1.2 2001/06/18 09:05:05 bouyer Exp $ */
2
3 /*-
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Charles M. Hannum.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 /*
40 * Originally written by Julian Elischer (julian (at) tfs.com)
41 * for TRW Financial Systems for use under the MACH(2.5) operating system.
42 *
43 * TRW Financial Systems, in accordance with their agreement with Carnegie
44 * Mellon University, makes this software available to CMU to distribute
45 * or use in any manner that they see fit as long as this message is kept with
46 * the software. For this reason TFS also grants any other persons or
47 * organisations permission to use or modify this software.
48 *
49 * TFS supplies this software to be publicly redistributed
50 * on the understanding that TFS is not responsible for the correct
51 * functioning of this software in any circumstances.
52 *
53 * Ported to run under 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
54 * major changes by Julian Elischer (julian (at) jules.dialix.oz.au) May 1993
55 *
56 * A lot of rewhacking done by mjacob (mjacob (at) nas.nasa.gov).
57 */
58
59 #include "opt_scsi.h"
60 #include "rnd.h"
61
62 #include <sys/types.h>
63 #include <sys/param.h>
64 #include <sys/device.h>
65 #include <sys/buf.h>
66 #include <sys/conf.h>
67 #include <sys/kernel.h>
68 #include <sys/systm.h>
69
70 #include <dev/scsipi/stvar.h>
71 #include <dev/scsipi/atapi_tape.h>
72
73 int st_atapibus_match __P((struct device *, struct cfdata *, void *));
74 void st_atapibus_attach __P((struct device *, struct device *, void *));
75 int st_atapibus_ops __P((struct st_softc *, int, int));
76 int st_atapibus_mode_sense __P((struct st_softc *, int));
77 int st_atapibus_mode_select __P((struct st_softc *, int));
78 int st_atapibus_do_ms __P((struct st_softc *, int, void *, int, int));
79
80 struct cfattach st_atapibus_ca = {
81 sizeof(struct st_softc), st_atapibus_match, st_atapibus_attach
82 };
83
84 const struct scsipi_inquiry_pattern st_atapibus_patterns[] = {
85 {T_SEQUENTIAL, T_REMOV,
86 "", "", ""},
87 };
88
89 int
90 st_atapibus_match(parent, match, aux)
91 struct device *parent;
92 struct cfdata *match;
93 void *aux;
94 {
95 struct scsipibus_attach_args *sa = aux;
96 int priority;
97
98 if (scsipi_periph_bustype(sa->sa_periph) != SCSIPI_BUSTYPE_ATAPI)
99 return (0);
100
101 (void)scsipi_inqmatch(&sa->sa_inqbuf,
102 (caddr_t)st_atapibus_patterns,
103 sizeof(st_atapibus_patterns)/sizeof(st_atapibus_patterns[0]),
104 sizeof(st_atapibus_patterns[0]), &priority);
105 return (priority);
106 }
107
108 void
109 st_atapibus_attach(parent, self, aux)
110 struct device *parent, *self;
111 void *aux;
112 {
113 struct st_softc *st = (void *)self;
114
115 st->ops = st_atapibus_ops;
116 stattach(parent, st, aux);
117 }
118
119 int
120 st_atapibus_ops(st, op, flags)
121 struct st_softc *st;
122 int op;
123 int flags;
124 {
125 switch(op) {
126 case ST_OPS_RBL:
127 /* done in mode_sense */
128 return 0;
129 case ST_OPS_MODESENSE:
130 return st_atapibus_mode_sense(st, flags);
131 case ST_OPS_MODESELECT:
132 return st_atapibus_mode_select(st, flags);
133 case ST_OPS_CMPRSS_ON:
134 case ST_OPS_CMPRSS_OFF:
135 return ENODEV;
136 default:
137 panic("st_scsibus_ops: invalid op");
138 /* NOTREACHED */
139 }
140 }
141
142 int
143 st_atapibus_mode_sense(st, flags)
144 struct st_softc *st;
145 int flags;
146 {
147 int count, error;
148 struct atapi_cappage cappage;
149 struct scsipi_periph *periph = st->sc_periph;
150
151 /* get drive capabilities, some drives needs this repeated */
152 for (count = 0 ; count < 5 ; count++) {
153 error = scsipi_mode_sense(periph, SMS_DBD,
154 ATAPI_TAPE_CAP_PAGE, &cappage.header, sizeof(cappage),
155 flags | XS_CTL_DATA_ONSTACK, ST_RETRIES, ST_CTL_TIME);
156 if (error == 0) {
157 st->numblks = 0; /* unused anyway */
158 if (cappage.cap4 & ATAPI_TAPE_CAP_PAGE_BLK32K)
159 st->media_blksize = 32768;
160 else if (cappage.cap4 & ATAPI_TAPE_CAP_PAGE_BLK1K)
161 st->media_blksize = 1024;
162 else if (cappage.cap4 & ATAPI_TAPE_CAP_PAGE_BLK512)
163 st->media_blksize = 512;
164 else {
165 error = ENODEV;
166 continue;
167 }
168 st->blkmin = st->blkmax = st->media_blksize;
169 st->media_density = 0;
170 if (cappage.header.dev_spec & SMH_DSP_WRITE_PROT)
171 st->flags |= ST_READONLY;
172 else
173 st->flags &= ~ST_READONLY;
174 SC_DEBUG(periph, SCSIPI_DB3,
175 ("density code %d, %d-byte blocks, write-%s, ",
176 st->media_density, st->media_blksize,
177 st->flags & ST_READONLY ? "protected" : "enabled"));
178 SC_DEBUG(periph, SCSIPI_DB3,
179 ("%sbuffered\n",
180 cappage.header.dev_spec & SMH_DSP_BUFF_MODE ?
181 "" : "un"));
182 periph->periph_flags |= PERIPH_MEDIA_LOADED;
183 return 0;
184 }
185 }
186 return error;
187 }
188
189 int
190 st_atapibus_mode_select(st, flags)
191 struct st_softc *st;
192 int flags;
193 {
194 return ENODEV; /* for now ... */
195 }
196