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 --- |