Deleted Added
full compact
vpoio.c (38061) vpoio.c (39134)
1/*-
2 * Copyright (c) 1998 Nicolas Souchu
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 1998 Nicolas Souchu
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $Id: vpoio.c,v 1.1.2.4 1998/06/16 23:35:52 son Exp $
26 * $Id: vpoio.c,v 1.1.2.6 1998/08/07 01:59:49 son Exp $
27 *
28 */
29
30#ifdef KERNEL
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/malloc.h>
34#include <sys/buf.h>

--- 37 unchanged lines hidden (view full) ---

72#define H_AUTO n(AUTOFEED)
73#define H_nAUTO AUTOFEED
74#define H_STROBE n(STROBE)
75#define H_nSTROBE STROBE
76#define H_BSY n(nBUSY)
77#define H_nBSY nBUSY
78#define H_SEL SELECT
79#define H_nSEL n(SELECT)
27 *
28 */
29
30#ifdef KERNEL
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/malloc.h>
34#include <sys/buf.h>

--- 37 unchanged lines hidden (view full) ---

72#define H_AUTO n(AUTOFEED)
73#define H_nAUTO AUTOFEED
74#define H_STROBE n(STROBE)
75#define H_nSTROBE STROBE
76#define H_BSY n(nBUSY)
77#define H_nBSY nBUSY
78#define H_SEL SELECT
79#define H_nSEL n(SELECT)
80#define H_ERR ERROR
81#define H_nERR n(ERROR)
80#define H_ERR PERROR
81#define H_nERR n(PERROR)
82#define H_ACK nACK
83#define H_nACK n(nACK)
84#define H_FLT nFAULT
85#define H_nFLT n(nFAULT)
86#define H_SELIN n(SELECTIN)
87#define H_nSELIN SELECTIN
88#define H_INIT nINIT
89#define H_nINIT n(nINIT)
90
91/*
92 * Microcode to execute very fast I/O sequences at the lowest bus level.
93 */
94
82#define H_ACK nACK
83#define H_nACK n(nACK)
84#define H_FLT nFAULT
85#define H_nFLT n(nFAULT)
86#define H_SELIN n(SELECTIN)
87#define H_nSELIN SELECTIN
88#define H_INIT nINIT
89#define H_nINIT n(nINIT)
90
91/*
92 * Microcode to execute very fast I/O sequences at the lowest bus level.
93 */
94
95#define trig_d_pulse MS_TRIG(MS_REG_CTR,5,(int)d_pulse)
96char d_pulse[] = {
95/* call this macro to initialize connect/disconnect microsequences */
96#define INIT_TRIG_MICROSEQ { \
97 int i; \
98 for (i=1; i <= 7; i+=2) { \
99 disconnect_microseq[i].arg[2] = (void *)d_pulse; \
100 connect_epp_microseq[i].arg[2] = \
101 connect_spp_microseq[i].arg[2] = (void *)c_pulse; \
102 } \
103}
104
105#define trig_d_pulse MS_TRIG(MS_REG_CTR,5,MS_UNKNOWN /* d_pulse */)
106static char d_pulse[] = {
97 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
98 H_nAUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE,
99 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
100 H_AUTO | H_SELIN | H_INIT | H_STROBE, VP0_PULSE,
101 H_AUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE
102};
103
107 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
108 H_nAUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE,
109 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
110 H_AUTO | H_SELIN | H_INIT | H_STROBE, VP0_PULSE,
111 H_AUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE
112};
113
104#define trig_c_pulse MS_TRIG(MS_REG_CTR,5,(int)c_pulse)
105char c_pulse[] = {
114#define trig_c_pulse MS_TRIG(MS_REG_CTR,5,MS_UNKNOWN /* c_pulse */)
115static char c_pulse[] = {
106 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
107 H_AUTO | H_SELIN | H_INIT | H_STROBE, 0,
108 H_nAUTO | H_SELIN | H_INIT | H_STROBE, VP0_PULSE,
109 H_AUTO | H_SELIN | H_INIT | H_STROBE, 0,
110 H_AUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE
111};
112
116 H_AUTO | H_nSELIN | H_INIT | H_STROBE, 0,
117 H_AUTO | H_SELIN | H_INIT | H_STROBE, 0,
118 H_nAUTO | H_SELIN | H_INIT | H_STROBE, VP0_PULSE,
119 H_AUTO | H_SELIN | H_INIT | H_STROBE, 0,
120 H_AUTO | H_nSELIN | H_INIT | H_STROBE, VP0_PULSE
121};
122
113struct ppb_microseq disconnect_microseq[] = {
123static struct ppb_microseq disconnect_microseq[] = {
114 MS_DASS(0x0), trig_d_pulse, MS_DASS(0x3c), trig_d_pulse,
115 MS_DASS(0x20), trig_d_pulse, MS_DASS(0xf), trig_d_pulse, MS_RET(0)
116};
117
124 MS_DASS(0x0), trig_d_pulse, MS_DASS(0x3c), trig_d_pulse,
125 MS_DASS(0x20), trig_d_pulse, MS_DASS(0xf), trig_d_pulse, MS_RET(0)
126};
127
118struct ppb_microseq connect_epp_microseq[] = {
128static struct ppb_microseq connect_epp_microseq[] = {
119 MS_DASS(0x0), trig_c_pulse, MS_DASS(0x3c), trig_c_pulse,
120 MS_DASS(0x20), trig_c_pulse, MS_DASS(0xcf), trig_c_pulse, MS_RET(0)
121};
122
129 MS_DASS(0x0), trig_c_pulse, MS_DASS(0x3c), trig_c_pulse,
130 MS_DASS(0x20), trig_c_pulse, MS_DASS(0xcf), trig_c_pulse, MS_RET(0)
131};
132
123struct ppb_microseq connect_spp_microseq[] = {
133static struct ppb_microseq connect_spp_microseq[] = {
124 MS_DASS(0x0), trig_c_pulse, MS_DASS(0x3c), trig_c_pulse,
125 MS_DASS(0x20), trig_c_pulse, MS_DASS(0x8f), trig_c_pulse, MS_RET(0)
126};
127
128/*
129 * nibble_inbyte_hook()
130 *
131 * Formats high and low nibble into a character

--- 7 unchanged lines hidden (view full) ---

139 *ptr++ = ((s->l >> 4) & 0x0f) + (s->h & 0xf0);
140
141 return (0);
142}
143
144/*
145 * Macro used to initialize each vpoio_data structure during
146 * low level attachment
134 MS_DASS(0x0), trig_c_pulse, MS_DASS(0x3c), trig_c_pulse,
135 MS_DASS(0x20), trig_c_pulse, MS_DASS(0x8f), trig_c_pulse, MS_RET(0)
136};
137
138/*
139 * nibble_inbyte_hook()
140 *
141 * Formats high and low nibble into a character

--- 7 unchanged lines hidden (view full) ---

149 *ptr++ = ((s->l >> 4) & 0x0f) + (s->h & 0xf0);
150
151 return (0);
152}
153
154/*
155 * Macro used to initialize each vpoio_data structure during
156 * low level attachment
157 *
158 * XXX should be converted to ppb_MS_init_msq()
147 */
148#define INIT_NIBBLE_INBYTE_SUBMICROSEQ(vpo) { \
149 (vpo)->vpo_nibble_inbyte_msq[2].arg[2].p = \
150 (void *)&(vpo)->vpo_nibble.h; \
151 (vpo)->vpo_nibble_inbyte_msq[4].arg[2].p = \
152 (void *)&(vpo)->vpo_nibble.l; \
153 (vpo)->vpo_nibble_inbyte_msq[5].arg[0].f = \
154 nibble_inbyte_hook; \
155 (vpo)->vpo_nibble_inbyte_msq[5].arg[1].p = \
156 (void *)&(vpo)->vpo_nibble; \
157}
158
159/*
160 * This is the sub-microseqence for MS_GET in NIBBLE mode
161 * Retrieve the two nibbles and call the C function to generate the character
162 * and store it in the buffer (see nibble_inbyte_hook())
163 */
159 */
160#define INIT_NIBBLE_INBYTE_SUBMICROSEQ(vpo) { \
161 (vpo)->vpo_nibble_inbyte_msq[2].arg[2].p = \
162 (void *)&(vpo)->vpo_nibble.h; \
163 (vpo)->vpo_nibble_inbyte_msq[4].arg[2].p = \
164 (void *)&(vpo)->vpo_nibble.l; \
165 (vpo)->vpo_nibble_inbyte_msq[5].arg[0].f = \
166 nibble_inbyte_hook; \
167 (vpo)->vpo_nibble_inbyte_msq[5].arg[1].p = \
168 (void *)&(vpo)->vpo_nibble; \
169}
170
171/*
172 * This is the sub-microseqence for MS_GET in NIBBLE mode
173 * Retrieve the two nibbles and call the C function to generate the character
174 * and store it in the buffer (see nibble_inbyte_hook())
175 */
164struct ppb_microseq nibble_inbyte_submicroseq[] = {
176static struct ppb_microseq nibble_inbyte_submicroseq[] = {
165
166/* loop: */
167 MS_CASS( H_AUTO | H_SELIN | H_INIT | H_STROBE),
168 MS_DELAY(VP0_PULSE),
169 MS_RFETCH(MS_REG_STR, MS_FETCH_ALL, MS_UNKNOWN /* high nibble */),
170 MS_CASS(H_nAUTO | H_SELIN | H_INIT | H_STROBE),
171 MS_RFETCH(MS_REG_STR, MS_FETCH_ALL, MS_UNKNOWN /* low nibble */),
172
173 /* do a C call to format the received nibbles */
174 MS_C_CALL(MS_UNKNOWN /* C hook */, MS_UNKNOWN /* param */),
175 MS_DBRA(-6 /* loop */),
176
177 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
178 MS_RET(0)
179};
180
181/*
182 * This is the sub-microseqence for MS_GET in PS2 mode
183 */
177
178/* loop: */
179 MS_CASS( H_AUTO | H_SELIN | H_INIT | H_STROBE),
180 MS_DELAY(VP0_PULSE),
181 MS_RFETCH(MS_REG_STR, MS_FETCH_ALL, MS_UNKNOWN /* high nibble */),
182 MS_CASS(H_nAUTO | H_SELIN | H_INIT | H_STROBE),
183 MS_RFETCH(MS_REG_STR, MS_FETCH_ALL, MS_UNKNOWN /* low nibble */),
184
185 /* do a C call to format the received nibbles */
186 MS_C_CALL(MS_UNKNOWN /* C hook */, MS_UNKNOWN /* param */),
187 MS_DBRA(-6 /* loop */),
188
189 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
190 MS_RET(0)
191};
192
193/*
194 * This is the sub-microseqence for MS_GET in PS2 mode
195 */
184struct ppb_microseq ps2_inbyte_submicroseq[] = {
196static struct ppb_microseq ps2_inbyte_submicroseq[] = {
185 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE),
186
187/* loop: */
188 MS_RFETCH_P(1, MS_REG_DTR, MS_FETCH_ALL),
189 MS_CASS(PCD | H_nAUTO | H_SELIN | H_INIT | H_nSTROBE),
190 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE),
191 MS_DBRA(-3 /* loop */),
192
193 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
194 MS_RET(0)
195};
196
197/*
198 * This is the sub-microsequence for MS_PUT in both NIBBLE and PS2 modes
199 */
197 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE),
198
199/* loop: */
200 MS_RFETCH_P(1, MS_REG_DTR, MS_FETCH_ALL),
201 MS_CASS(PCD | H_nAUTO | H_SELIN | H_INIT | H_nSTROBE),
202 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_nSTROBE),
203 MS_DBRA(-3 /* loop */),
204
205 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
206 MS_RET(0)
207};
208
209/*
210 * This is the sub-microsequence for MS_PUT in both NIBBLE and PS2 modes
211 */
200struct ppb_microseq spp_outbyte_submicroseq[] = {
212static struct ppb_microseq spp_outbyte_submicroseq[] = {
201
202/* loop: */
203 MS_RASSERT_P(1, MS_REG_DTR),
204 MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE),
205 MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
206 MS_DELAY(VP0_PULSE),
207 MS_DBRA(-4 /* loop */),
208
209 /* return from the put call */
210 MS_RET(0)
211};
212
213/* EPP 1.7 microsequences, ptr and len set at runtime */
213
214/* loop: */
215 MS_RASSERT_P(1, MS_REG_DTR),
216 MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE),
217 MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
218 MS_DELAY(VP0_PULSE),
219 MS_DBRA(-4 /* loop */),
220
221 /* return from the put call */
222 MS_RET(0)
223};
224
225/* EPP 1.7 microsequences, ptr and len set at runtime */
214struct ppb_microseq epp17_outstr_body[] = {
226static struct ppb_microseq epp17_outstr_body[] = {
215 MS_CASS(H_AUTO | H_SELIN | H_INIT | H_STROBE),
216
217/* loop: */
218 MS_RASSERT_P(1, MS_REG_EPP),
219 MS_BRSET(TIMEOUT, 4 /* error */), /* EPP timeout? */
220 MS_DBRA(-2 /* loop */),
221
222 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
223 MS_RET(0),
224/* error: */
225 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
226 MS_RET(1)
227};
228
227 MS_CASS(H_AUTO | H_SELIN | H_INIT | H_STROBE),
228
229/* loop: */
230 MS_RASSERT_P(1, MS_REG_EPP),
231 MS_BRSET(TIMEOUT, 4 /* error */), /* EPP timeout? */
232 MS_DBRA(-2 /* loop */),
233
234 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
235 MS_RET(0),
236/* error: */
237 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
238 MS_RET(1)
239};
240
229struct ppb_microseq epp17_instr_body[] = {
241static struct ppb_microseq epp17_instr_body[] = {
230 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_STROBE),
231
232/* loop: */
233 MS_RFETCH_P(1, MS_REG_EPP, MS_FETCH_ALL),
234 MS_BRSET(TIMEOUT, 4 /* error */), /* EPP timeout? */
235 MS_DBRA(-2 /* loop */),
236
237 MS_CASS(PCD | H_AUTO | H_nSELIN | H_INIT | H_STROBE),
238 MS_RET(0),
239/* error: */
240 MS_CASS(PCD | H_AUTO | H_nSELIN | H_INIT | H_STROBE),
241 MS_RET(1)
242};
243
242 MS_CASS(PCD | H_AUTO | H_SELIN | H_INIT | H_STROBE),
243
244/* loop: */
245 MS_RFETCH_P(1, MS_REG_EPP, MS_FETCH_ALL),
246 MS_BRSET(TIMEOUT, 4 /* error */), /* EPP timeout? */
247 MS_DBRA(-2 /* loop */),
248
249 MS_CASS(PCD | H_AUTO | H_nSELIN | H_INIT | H_STROBE),
250 MS_RET(0),
251/* error: */
252 MS_CASS(PCD | H_AUTO | H_nSELIN | H_INIT | H_STROBE),
253 MS_RET(1)
254};
255
256static struct ppb_microseq in_disk_mode[] = {
257 MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
258 MS_CASS(H_nAUTO | H_nSELIN | H_INIT | H_STROBE),
259
260 MS_BRCLEAR(H_FLT, 4 /* error */),
261 MS_CASS( H_AUTO | H_nSELIN | H_INIT | H_STROBE),
262 MS_BRSET(H_FLT, 2 /* error */),
263
264 MS_RET(0),
265/* error: */
266 MS_RET(1)
267};
268
244static int
245vpoio_disconnect(struct vpoio_data *vpo)
246{
247 int ret;
248
249 ppb_MS_microseq(&vpo->vpo_dev, disconnect_microseq, &ret);
250 return (ppb_release_bus(&vpo->vpo_dev));
251}

--- 14 unchanged lines hidden (view full) ---

266 ppb_MS_microseq(&vpo->vpo_dev, connect_epp_microseq, &ret);
267 else
268 ppb_MS_microseq(&vpo->vpo_dev, connect_spp_microseq, &ret);
269
270 return (0);
271}
272
273/*
269static int
270vpoio_disconnect(struct vpoio_data *vpo)
271{
272 int ret;
273
274 ppb_MS_microseq(&vpo->vpo_dev, disconnect_microseq, &ret);
275 return (ppb_release_bus(&vpo->vpo_dev));
276}

--- 14 unchanged lines hidden (view full) ---

291 ppb_MS_microseq(&vpo->vpo_dev, connect_epp_microseq, &ret);
292 else
293 ppb_MS_microseq(&vpo->vpo_dev, connect_spp_microseq, &ret);
294
295 return (0);
296}
297
298/*
274 * vpoio_in_disk_mode()
299 * vpoio_reset()
275 *
300 *
276 * Check if we are in disk mode
277 *
278 * XXX should be ported to microseq with MS_ASSERT()
301 * SCSI reset signal, the drive must be in disk mode
279 */
302 */
280static int
281vpoio_in_disk_mode(struct vpoio_data *vpo)
303static void
304vpoio_reset (struct vpoio_data *vpo)
282{
305{
306 int ret;
283
307
284 /* first, set H_AUTO high */
285 ppb_wctr(&vpo->vpo_dev, H_AUTO | H_nSELIN | H_INIT | H_STROBE);
308 struct ppb_microseq reset_microseq[] = {
286
309
287 /* when H_AUTO is set low, H_FLT should be high */
288 ppb_wctr(&vpo->vpo_dev, H_nAUTO | H_nSELIN | H_INIT | H_STROBE);
289 if ((ppb_rstr(&vpo->vpo_dev) & H_FLT) == 0)
290 return (0);
310 #define INITIATOR MS_PARAM(0, 1, MS_TYP_INT)
291
311
292 /* when H_AUTO is set high, H_FLT should be low */
293 ppb_wctr(&vpo->vpo_dev, H_AUTO | H_nSELIN | H_INIT | H_STROBE);
294 if ((ppb_rstr(&vpo->vpo_dev) & H_FLT) != 0)
295 return (0);
312 MS_DASS(MS_UNKNOWN),
313 MS_CASS(H_AUTO | H_nSELIN | H_nINIT | H_STROBE),
314 MS_DELAY(25),
315 MS_CASS(H_AUTO | H_nSELIN | H_INIT | H_STROBE),
316 MS_RET(0)
317 };
296
318
297 return (1);
319 ppb_MS_init_msq(reset_microseq, 1, INITIATOR, 1 << VP0_INITIATOR);
320 ppb_MS_microseq(&vpo->vpo_dev, reset_microseq, &ret);
321
322 return;
298}
299
300/*
323}
324
325/*
301 * vpoio_reset()
302 *
303 * SCSI reset signal, the drive must be in disk mode
304 *
305 * XXX should be ported to microseq with MS_TRIG()
326 * vpoio_in_disk_mode()
306 */
327 */
307static void
308vpoio_reset (struct vpoio_data *vpo)
328static int
329vpoio_in_disk_mode(struct vpoio_data *vpo)
309{
330{
331 int ret;
310
332
311 /*
312 * SCSI reset signal.
313 */
314 ppb_wdtr(&vpo->vpo_dev, (1 << VP0_INITIATOR));
315 ppb_wctr(&vpo->vpo_dev, H_AUTO | H_nSELIN | H_nINIT | H_STROBE);
316 DELAY(25);
317 ppb_wctr(&vpo->vpo_dev, H_AUTO | H_nSELIN | H_INIT | H_STROBE);
333 ppb_MS_microseq(&vpo->vpo_dev, in_disk_mode, &ret);
318
334
319 return;
335 return (ret);
320}
321
322/*
323 * vpoio_detect()
324 *
325 * Detect and initialise the VP0 adapter.
326 */
336}
337
338/*
339 * vpoio_detect()
340 *
341 * Detect and initialise the VP0 adapter.
342 */
327int
343static int
328vpoio_detect(struct vpoio_data *vpo)
329{
344vpoio_detect(struct vpoio_data *vpo)
345{
330
331 vpoio_disconnect(vpo);
332 vpoio_connect(vpo, PPB_DONTWAIT);
333
346 vpoio_disconnect(vpo);
347 vpoio_connect(vpo, PPB_DONTWAIT);
348
334 if (!vpoio_in_disk_mode(vpo)) {
349 if (vpoio_in_disk_mode(vpo)) {
335 vpoio_disconnect(vpo);
336 return (VP0_EINITFAILED);
337 }
338
339 /* send SCSI reset signal */
340 vpoio_reset(vpo);
341
342 vpoio_disconnect(vpo);
343
350 vpoio_disconnect(vpo);
351 return (VP0_EINITFAILED);
352 }
353
354 /* send SCSI reset signal */
355 vpoio_reset(vpo);
356
357 vpoio_disconnect(vpo);
358
344 if (vpoio_in_disk_mode(vpo))
359 /* ensure we are disconnected or daisy chained peripheral
360 * may cause serious problem to the disk */
361
362 if (!vpoio_in_disk_mode(vpo))
345 return (VP0_EINITFAILED);
346
347 return (0);
348}
349
350/*
351 * vpoio_outstr()
352 */

--- 166 unchanged lines hidden (view full) ---

519vpoio_probe(struct ppb_data *ppb, struct vpoio_data *vpo)
520{
521
522 /* ppbus dependent initialisation */
523 vpo->vpo_dev.id_unit = vpo->vpo_unit;
524 vpo->vpo_dev.name = "vpo";
525 vpo->vpo_dev.ppb = ppb;
526
363 return (VP0_EINITFAILED);
364
365 return (0);
366}
367
368/*
369 * vpoio_outstr()
370 */

--- 166 unchanged lines hidden (view full) ---

537vpoio_probe(struct ppb_data *ppb, struct vpoio_data *vpo)
538{
539
540 /* ppbus dependent initialisation */
541 vpo->vpo_dev.id_unit = vpo->vpo_unit;
542 vpo->vpo_dev.name = "vpo";
543 vpo->vpo_dev.ppb = ppb;
544
545 /*
546 * Initialize microsequence code
547 */
548 INIT_TRIG_MICROSEQ;
549
527 /* now, try to initialise the drive */
528 if (vpoio_detect(vpo)) {
529 return (NULL);
530 }
531
532 return (&vpo->vpo_dev);
533}
534

--- 6 unchanged lines hidden (view full) ---

541int
542vpoio_attach(struct vpoio_data *vpo)
543{
544 int epp;
545
546 /*
547 * Report ourselves
548 */
550 /* now, try to initialise the drive */
551 if (vpoio_detect(vpo)) {
552 return (NULL);
553 }
554
555 return (&vpo->vpo_dev);
556}
557

--- 6 unchanged lines hidden (view full) ---

564int
565vpoio_attach(struct vpoio_data *vpo)
566{
567 int epp;
568
569 /*
570 * Report ourselves
571 */
549 printf("vpo%d: <Iomega VPI0 Parallel to SCSI adapter> on ppbus %d\n",
572 printf("vpo%d: <Iomega VPI0 Parallel to SCSI interface> on ppbus %d\n",
550 vpo->vpo_dev.id_unit, vpo->vpo_dev.ppb->ppb_link->adapter_unit);
551
573 vpo->vpo_dev.id_unit, vpo->vpo_dev.ppb->ppb_link->adapter_unit);
574
552 /*
553 * Initialize microsequence code
554 */
555 vpo->vpo_nibble_inbyte_msq = (struct ppb_microseq *)malloc(
556 sizeof(nibble_inbyte_submicroseq), M_DEVBUF, M_NOWAIT);
557
558 if (!vpo->vpo_nibble_inbyte_msq)
559 return (0);
560
561 bcopy((void *)nibble_inbyte_submicroseq,
562 (void *)vpo->vpo_nibble_inbyte_msq,

--- 78 unchanged lines hidden (view full) ---

641/*
642 * vpoio_reset_bus()
643 *
644 */
645int
646vpoio_reset_bus(struct vpoio_data *vpo)
647{
648 /* first, connect to the drive */
575 vpo->vpo_nibble_inbyte_msq = (struct ppb_microseq *)malloc(
576 sizeof(nibble_inbyte_submicroseq), M_DEVBUF, M_NOWAIT);
577
578 if (!vpo->vpo_nibble_inbyte_msq)
579 return (0);
580
581 bcopy((void *)nibble_inbyte_submicroseq,
582 (void *)vpo->vpo_nibble_inbyte_msq,

--- 78 unchanged lines hidden (view full) ---

661/*
662 * vpoio_reset_bus()
663 *
664 */
665int
666vpoio_reset_bus(struct vpoio_data *vpo)
667{
668 /* first, connect to the drive */
649 if (vpoio_connect(vpo, PPB_WAIT|PPB_INTR) ||
650 (vpoio_in_disk_mode(vpo) == 0)) {
651
669 if (vpoio_connect(vpo, PPB_WAIT|PPB_INTR) || vpoio_in_disk_mode(vpo)) {
652 /* release ppbus */
653 vpoio_disconnect(vpo);
654 return (1);
655 }
656
657 /* reset the SCSI bus */
658 vpoio_reset(vpo);
659

--- 26 unchanged lines hidden (view full) ---

686 * XXX
687 * Should we allow this call to be interruptible?
688 * The only way to report the interruption is to return
689 * EIO do upper SCSI code :^(
690 */
691 if ((error = vpoio_connect(vpo, PPB_WAIT|PPB_INTR)))
692 return (error);
693
670 /* release ppbus */
671 vpoio_disconnect(vpo);
672 return (1);
673 }
674
675 /* reset the SCSI bus */
676 vpoio_reset(vpo);
677

--- 26 unchanged lines hidden (view full) ---

704 * XXX
705 * Should we allow this call to be interruptible?
706 * The only way to report the interruption is to return
707 * EIO do upper SCSI code :^(
708 */
709 if ((error = vpoio_connect(vpo, PPB_WAIT|PPB_INTR)))
710 return (error);
711
694 if (!vpoio_in_disk_mode(vpo)) {
712 if (vpoio_in_disk_mode(vpo)) {
695 *ret = VP0_ECONNECT; goto error;
696 }
697
698 if ((*ret = vpoio_select(vpo,host,target)))
699 goto error;
700
701 /*
702 * Send the command ...

--- 69 unchanged lines hidden ---
713 *ret = VP0_ECONNECT; goto error;
714 }
715
716 if ((*ret = vpoio_select(vpo,host,target)))
717 goto error;
718
719 /*
720 * Send the command ...

--- 69 unchanged lines hidden ---