1 1.63 riastrad /* $NetBSD: mb89352.c,v 1.63 2023/05/10 00:10:54 riastradh Exp $ */ 2 1.1 minoura /* NecBSD: mb89352.c,v 1.4 1998/03/14 07:31:20 kmatsuda Exp */ 3 1.1 minoura 4 1.1 minoura /*- 5 1.48 martin * Copyright (c) 1996-1999,2004 The NetBSD Foundation, Inc. 6 1.1 minoura * All rights reserved. 7 1.1 minoura * 8 1.1 minoura * This code is derived from software contributed to The NetBSD Foundation 9 1.1 minoura * by Charles M. Hannum, Masaru Oki and Kouichi Matsuda. 10 1.1 minoura * 11 1.1 minoura * Redistribution and use in source and binary forms, with or without 12 1.1 minoura * modification, are permitted provided that the following conditions 13 1.1 minoura * are met: 14 1.1 minoura * 1. Redistributions of source code must retain the above copyright 15 1.1 minoura * notice, this list of conditions and the following disclaimer. 16 1.1 minoura * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 minoura * notice, this list of conditions and the following disclaimer in the 18 1.1 minoura * documentation and/or other materials provided with the distribution. 19 1.48 martin * 20 1.48 martin * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.48 martin * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.48 martin * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.48 martin * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.48 martin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.48 martin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.48 martin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.48 martin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.48 martin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.48 martin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.48 martin * POSSIBILITY OF SUCH DAMAGE. 31 1.1 minoura * 32 1.1 minoura * Copyright (c) 1994 Jarle Greipsland 33 1.1 minoura * All rights reserved. 34 1.1 minoura * 35 1.1 minoura * Redistribution and use in source and binary forms, with or without 36 1.1 minoura * modification, are permitted provided that the following conditions 37 1.1 minoura * are met: 38 1.1 minoura * 1. Redistributions of source code must retain the above copyright 39 1.1 minoura * notice, this list of conditions and the following disclaimer. 40 1.1 minoura * 2. Redistributions in binary form must reproduce the above copyright 41 1.1 minoura * notice, this list of conditions and the following disclaimer in the 42 1.1 minoura * documentation and/or other materials provided with the distribution. 43 1.1 minoura * 3. The name of the author may not be used to endorse or promote products 44 1.1 minoura * derived from this software without specific prior written permission. 45 1.1 minoura * 46 1.1 minoura * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 47 1.1 minoura * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 48 1.1 minoura * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 49 1.1 minoura * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 50 1.1 minoura * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 51 1.1 minoura * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 52 1.1 minoura * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 53 1.1 minoura * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 54 1.1 minoura * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 55 1.1 minoura * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 56 1.1 minoura * POSSIBILITY OF SUCH DAMAGE. 57 1.1 minoura */ 58 1.1 minoura /* 59 1.1 minoura * [NetBSD for NEC PC-98 series] 60 1.1 minoura * Copyright (c) 1996, 1997, 1998 61 1.1 minoura * NetBSD/pc98 porting staff. All rights reserved. 62 1.1 minoura * Copyright (c) 1996, 1997, 1998 63 1.1 minoura * Kouichi Matsuda. All rights reserved. 64 1.1 minoura */ 65 1.1 minoura 66 1.1 minoura /* 67 1.1 minoura * Acknowledgements: Many of the algorithms used in this driver are 68 1.1 minoura * inspired by the work of Julian Elischer (julian (at) tfs.com) and 69 1.1 minoura * Charles Hannum (mycroft (at) duality.gnu.ai.mit.edu). Thanks a million! 70 1.1 minoura */ 71 1.1 minoura 72 1.1 minoura /* TODO list: 73 1.1 minoura * 1) Get the DMA stuff working. 74 1.1 minoura * 2) Get the iov/uio stuff working. Is this a good thing ??? 75 1.1 minoura * 3) Get the synch stuff working. 76 1.1 minoura * 4) Rewrite it to use malloc for the acb structs instead of static alloc.? 77 1.1 minoura */ 78 1.10 lukem 79 1.10 lukem #include <sys/cdefs.h> 80 1.63 riastrad __KERNEL_RCSID(0, "$NetBSD: mb89352.c,v 1.63 2023/05/10 00:10:54 riastradh Exp $"); 81 1.10 lukem 82 1.10 lukem #ifdef DDB 83 1.10 lukem #define integrate 84 1.10 lukem #else 85 1.40 perry #define integrate inline static 86 1.10 lukem #endif 87 1.1 minoura 88 1.1 minoura /* 89 1.1 minoura * A few customizable items: 90 1.1 minoura */ 91 1.1 minoura 92 1.1 minoura /* Synchronous data transfers? */ 93 1.1 minoura #define SPC_USE_SYNCHRONOUS 0 94 1.1 minoura #define SPC_SYNC_REQ_ACK_OFS 8 95 1.1 minoura 96 1.1 minoura /* Wide data transfers? */ 97 1.1 minoura #define SPC_USE_WIDE 0 98 1.1 minoura #define SPC_MAX_WIDTH 0 99 1.1 minoura 100 1.1 minoura /* Max attempts made to transmit a message */ 101 1.1 minoura #define SPC_MSG_MAX_ATTEMPT 3 /* Not used now XXX */ 102 1.1 minoura 103 1.1 minoura /* 104 1.1 minoura * Some spin loop parameters (essentially how long to wait some places) 105 1.1 minoura * The problem(?) is that sometimes we expect either to be able to transmit a 106 1.1 minoura * byte or to get a new one from the SCSI bus pretty soon. In order to avoid 107 1.1 minoura * returning from the interrupt just to get yanked back for the next byte we 108 1.1 minoura * may spin in the interrupt routine waiting for this byte to come. How long? 109 1.1 minoura * This is really (SCSI) device and processor dependent. Tuneable, I guess. 110 1.1 minoura */ 111 1.1 minoura #define SPC_MSGIN_SPIN 1 /* Will spinwait upto ?ms for a new msg byte */ 112 1.1 minoura #define SPC_MSGOUT_SPIN 1 113 1.1 minoura 114 1.16 tsutsui /* 115 1.16 tsutsui * Include debug functions? At the end of this file there are a bunch of 116 1.1 minoura * functions that will print out various information regarding queued SCSI 117 1.1 minoura * commands, driver state and chip contents. You can call them from the 118 1.1 minoura * kernel debugger. If you set SPC_DEBUG to 0 they are not included (the 119 1.1 minoura * kernel uses less memory) but you lose the debugging facilities. 120 1.1 minoura */ 121 1.19 tsutsui #if 0 122 1.1 minoura #define SPC_DEBUG 1 123 1.19 tsutsui #endif 124 1.1 minoura 125 1.1 minoura #define SPC_ABORT_TIMEOUT 2000 /* time to wait for abort */ 126 1.1 minoura 127 1.22 tsutsui /* threshold length for DMA transfer */ 128 1.22 tsutsui #define SPC_MIN_DMA_LEN 32 129 1.22 tsutsui 130 1.53 tsutsui #ifdef luna68k /* XXX old drives like DK312C in LUNAs require this */ 131 1.53 tsutsui #define NO_MANUAL_XFER 132 1.53 tsutsui #endif 133 1.21 tsutsui #ifdef x68k /* XXX it seems x68k SPC SCSI hardware has some quirks */ 134 1.21 tsutsui #define NEED_DREQ_ON_HARDWARE_XFER 135 1.21 tsutsui #define NO_MANUAL_XFER 136 1.21 tsutsui #endif 137 1.21 tsutsui 138 1.1 minoura /* End of customizable parameters */ 139 1.1 minoura 140 1.1 minoura /* 141 1.1 minoura * MB89352 SCSI Protocol Controller (SPC) routines. 142 1.1 minoura */ 143 1.1 minoura 144 1.1 minoura #include "opt_ddb.h" 145 1.1 minoura 146 1.1 minoura #include <sys/param.h> 147 1.1 minoura #include <sys/systm.h> 148 1.1 minoura #include <sys/kernel.h> 149 1.1 minoura #include <sys/errno.h> 150 1.1 minoura #include <sys/ioctl.h> 151 1.1 minoura #include <sys/device.h> 152 1.1 minoura #include <sys/buf.h> 153 1.1 minoura #include <sys/proc.h> 154 1.1 minoura #include <sys/queue.h> 155 1.1 minoura 156 1.46 ad #include <sys/intr.h> 157 1.46 ad #include <sys/bus.h> 158 1.1 minoura 159 1.1 minoura #include <dev/scsipi/scsi_all.h> 160 1.1 minoura #include <dev/scsipi/scsipi_all.h> 161 1.1 minoura #include <dev/scsipi/scsi_message.h> 162 1.1 minoura #include <dev/scsipi/scsiconf.h> 163 1.1 minoura 164 1.1 minoura #include <dev/ic/mb89352reg.h> 165 1.1 minoura #include <dev/ic/mb89352var.h> 166 1.16 tsutsui 167 1.56 riastrad #include "ioconf.h" 168 1.56 riastrad 169 1.1 minoura #ifndef DDB 170 1.1 minoura #define Debugger() panic("should call debugger here (mb89352.c)") 171 1.1 minoura #endif /* ! DDB */ 172 1.1 minoura 173 1.1 minoura #if SPC_DEBUG 174 1.1 minoura int spc_debug = 0x00; /* SPC_SHOWSTART|SPC_SHOWMISC|SPC_SHOWTRACE; */ 175 1.1 minoura #endif 176 1.1 minoura 177 1.37 tsutsui void spc_done(struct spc_softc *, struct spc_acb *); 178 1.37 tsutsui void spc_dequeue(struct spc_softc *, struct spc_acb *); 179 1.37 tsutsui void spc_scsipi_request(struct scsipi_channel *, scsipi_adapter_req_t, 180 1.37 tsutsui void *); 181 1.37 tsutsui int spc_poll(struct spc_softc *, struct scsipi_xfer *, int); 182 1.47 tsutsui integrate void spc_sched_msgout(struct spc_softc *, uint8_t); 183 1.37 tsutsui integrate void spc_setsync(struct spc_softc *, struct spc_tinfo *); 184 1.37 tsutsui void spc_select(struct spc_softc *, struct spc_acb *); 185 1.37 tsutsui void spc_timeout(void *); 186 1.37 tsutsui void spc_scsi_reset(struct spc_softc *); 187 1.37 tsutsui void spc_reset(struct spc_softc *); 188 1.37 tsutsui void spc_free_acb(struct spc_softc *, struct spc_acb *, int); 189 1.37 tsutsui struct spc_acb* spc_get_acb(struct spc_softc *); 190 1.37 tsutsui int spc_reselect(struct spc_softc *, int); 191 1.37 tsutsui void spc_msgin(struct spc_softc *); 192 1.37 tsutsui void spc_abort(struct spc_softc *, struct spc_acb *); 193 1.37 tsutsui void spc_msgout(struct spc_softc *); 194 1.47 tsutsui int spc_dataout_pio(struct spc_softc *, uint8_t *, int); 195 1.47 tsutsui int spc_datain_pio(struct spc_softc *, uint8_t *, int); 196 1.1 minoura #if SPC_DEBUG 197 1.37 tsutsui void spc_print_acb(struct spc_acb *); 198 1.37 tsutsui void spc_dump_driver(struct spc_softc *); 199 1.37 tsutsui void spc_dump89352(struct spc_softc *); 200 1.37 tsutsui void spc_show_scsi_cmd(struct spc_acb *); 201 1.37 tsutsui void spc_print_active_acb(void); 202 1.1 minoura #endif 203 1.1 minoura 204 1.1 minoura /* 205 1.1 minoura * INITIALIZATION ROUTINES (probe, attach ++) 206 1.1 minoura */ 207 1.1 minoura 208 1.3 minoura /* 209 1.3 minoura * Do the real search-for-device. 210 1.1 minoura * Prerequisite: sc->sc_iobase should be set to the proper value 211 1.1 minoura */ 212 1.1 minoura int 213 1.37 tsutsui spc_find(bus_space_tag_t iot, bus_space_handle_t ioh, int bdid) 214 1.1 minoura { 215 1.1 minoura long timeout = SPC_ABORT_TIMEOUT; 216 1.1 minoura 217 1.1 minoura SPC_TRACE(("spc: probing for spc-chip\n")); 218 1.1 minoura /* 219 1.1 minoura * Disable interrupts then reset the FUJITSU chip. 220 1.1 minoura */ 221 1.1 minoura bus_space_write_1(iot, ioh, SCTL, SCTL_DISABLE | SCTL_CTRLRST); 222 1.1 minoura bus_space_write_1(iot, ioh, SCMD, 0); 223 1.1 minoura bus_space_write_1(iot, ioh, PCTL, 0); 224 1.1 minoura bus_space_write_1(iot, ioh, TEMP, 0); 225 1.1 minoura bus_space_write_1(iot, ioh, TCH, 0); 226 1.1 minoura bus_space_write_1(iot, ioh, TCM, 0); 227 1.1 minoura bus_space_write_1(iot, ioh, TCL, 0); 228 1.1 minoura bus_space_write_1(iot, ioh, INTS, 0); 229 1.15 tsutsui bus_space_write_1(iot, ioh, SCTL, 230 1.15 tsutsui SCTL_DISABLE | SCTL_ABRT_ENAB | SCTL_PARITY_ENAB | SCTL_RESEL_ENAB); 231 1.1 minoura bus_space_write_1(iot, ioh, BDID, bdid); 232 1.1 minoura delay(400); 233 1.15 tsutsui bus_space_write_1(iot, ioh, SCTL, 234 1.15 tsutsui bus_space_read_1(iot, ioh, SCTL) & ~SCTL_DISABLE); 235 1.1 minoura 236 1.1 minoura /* The following detection is derived from spc.c 237 1.1 minoura * (by Takahide Matsutsuka) in FreeBSD/pccard-test. 238 1.1 minoura */ 239 1.19 tsutsui while (bus_space_read_1(iot, ioh, PSNS) && timeout) { 240 1.1 minoura timeout--; 241 1.19 tsutsui DELAY(1); 242 1.19 tsutsui } 243 1.19 tsutsui if (timeout == 0) { 244 1.1 minoura printf("spc: find failed\n"); 245 1.1 minoura return 0; 246 1.1 minoura } 247 1.1 minoura 248 1.1 minoura SPC_START(("SPC found")); 249 1.1 minoura return 1; 250 1.1 minoura } 251 1.1 minoura 252 1.1 minoura void 253 1.37 tsutsui spc_attach(struct spc_softc *sc) 254 1.1 minoura { 255 1.29 mycroft struct scsipi_adapter *adapt = &sc->sc_adapter; 256 1.29 mycroft struct scsipi_channel *chan = &sc->sc_channel; 257 1.1 minoura 258 1.17 tsutsui SPC_TRACE(("spc_attach ")); 259 1.1 minoura sc->sc_state = SPC_INIT; 260 1.1 minoura 261 1.1 minoura sc->sc_freq = 20; /* XXXX Assume 20 MHz. */ 262 1.1 minoura 263 1.1 minoura #if SPC_USE_SYNCHRONOUS 264 1.1 minoura /* 265 1.1 minoura * These are the bounds of the sync period, based on the frequency of 266 1.1 minoura * the chip's clock input and the size and offset of the sync period 267 1.1 minoura * register. 268 1.1 minoura * 269 1.47 tsutsui * For a 20MHz clock, this gives us 25, or 100ns, or 10MB/s, as a 270 1.47 tsutsui * maximum transfer rate, and 112.5, or 450ns, or 2.22MB/s, as a 271 1.1 minoura * minimum transfer rate. 272 1.1 minoura */ 273 1.1 minoura sc->sc_minsync = (2 * 250) / sc->sc_freq; 274 1.1 minoura sc->sc_maxsync = (9 * 250) / sc->sc_freq; 275 1.1 minoura #endif 276 1.1 minoura 277 1.29 mycroft /* 278 1.29 mycroft * Fill in the adapter. 279 1.29 mycroft */ 280 1.47 tsutsui adapt->adapt_dev = sc->sc_dev; 281 1.29 mycroft adapt->adapt_nchannels = 1; 282 1.29 mycroft adapt->adapt_openings = 7; 283 1.29 mycroft adapt->adapt_max_periph = 1; 284 1.29 mycroft adapt->adapt_request = spc_scsipi_request; 285 1.29 mycroft adapt->adapt_minphys = minphys; 286 1.29 mycroft 287 1.29 mycroft chan->chan_adapter = &sc->sc_adapter; 288 1.29 mycroft chan->chan_bustype = &scsi_bustype; 289 1.29 mycroft chan->chan_channel = 0; 290 1.29 mycroft chan->chan_ntargets = 8; 291 1.29 mycroft chan->chan_nluns = 8; 292 1.29 mycroft chan->chan_id = sc->sc_initiator; 293 1.1 minoura 294 1.1 minoura /* 295 1.29 mycroft * Add reference to adapter so that we drop the reference after 296 1.55 skrll * config_found() to make sure the adapter is disabled. 297 1.1 minoura */ 298 1.29 mycroft if (scsipi_adapter_addref(adapt) != 0) { 299 1.47 tsutsui aprint_error_dev(sc->sc_dev, "unable to enable controller\n"); 300 1.29 mycroft return; 301 1.29 mycroft } 302 1.29 mycroft 303 1.29 mycroft spc_init(sc, 1); /* Init chip and driver */ 304 1.1 minoura 305 1.1 minoura /* 306 1.1 minoura * ask the adapter what subunits are present 307 1.1 minoura */ 308 1.60 thorpej sc->sc_child = config_found(sc->sc_dev, chan, scsiprint, CFARGS_NONE); 309 1.29 mycroft scsipi_adapter_delref(adapt); 310 1.29 mycroft } 311 1.29 mycroft 312 1.50 dyoung void 313 1.50 dyoung spc_childdet(device_t self, device_t child) 314 1.29 mycroft { 315 1.47 tsutsui struct spc_softc *sc = device_private(self); 316 1.29 mycroft 317 1.50 dyoung if (sc->sc_child == child) 318 1.50 dyoung sc->sc_child = NULL; 319 1.29 mycroft } 320 1.29 mycroft 321 1.29 mycroft int 322 1.47 tsutsui spc_detach(device_t self, int flags) 323 1.29 mycroft { 324 1.63 riastrad int error; 325 1.29 mycroft 326 1.63 riastrad error = config_detach_children(self, flags); 327 1.63 riastrad if (error) 328 1.63 riastrad return error; 329 1.29 mycroft 330 1.63 riastrad return 0; 331 1.1 minoura } 332 1.1 minoura 333 1.3 minoura /* 334 1.3 minoura * Initialize MB89352 chip itself 335 1.1 minoura * The following conditions should hold: 336 1.1 minoura * spc_isa_probe should have succeeded, i.e. the iobase address in spc_softc 337 1.1 minoura * must be valid. 338 1.1 minoura */ 339 1.1 minoura void 340 1.37 tsutsui spc_reset(struct spc_softc *sc) 341 1.1 minoura { 342 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 343 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 344 1.1 minoura 345 1.1 minoura SPC_TRACE(("spc_reset ")); 346 1.1 minoura /* 347 1.1 minoura * Disable interrupts then reset the FUJITSU chip. 348 1.1 minoura */ 349 1.1 minoura bus_space_write_1(iot, ioh, SCTL, SCTL_DISABLE | SCTL_CTRLRST); 350 1.1 minoura bus_space_write_1(iot, ioh, SCMD, 0); 351 1.19 tsutsui bus_space_write_1(iot, ioh, TMOD, 0); 352 1.1 minoura bus_space_write_1(iot, ioh, PCTL, 0); 353 1.1 minoura bus_space_write_1(iot, ioh, TEMP, 0); 354 1.1 minoura bus_space_write_1(iot, ioh, TCH, 0); 355 1.1 minoura bus_space_write_1(iot, ioh, TCM, 0); 356 1.1 minoura bus_space_write_1(iot, ioh, TCL, 0); 357 1.1 minoura bus_space_write_1(iot, ioh, INTS, 0); 358 1.15 tsutsui bus_space_write_1(iot, ioh, SCTL, 359 1.15 tsutsui SCTL_DISABLE | SCTL_ABRT_ENAB | SCTL_PARITY_ENAB | SCTL_RESEL_ENAB); 360 1.1 minoura bus_space_write_1(iot, ioh, BDID, sc->sc_initiator); 361 1.1 minoura delay(400); 362 1.15 tsutsui bus_space_write_1(iot, ioh, SCTL, 363 1.15 tsutsui bus_space_read_1(iot, ioh, SCTL) & ~SCTL_DISABLE); 364 1.1 minoura } 365 1.1 minoura 366 1.1 minoura 367 1.1 minoura /* 368 1.1 minoura * Pull the SCSI RST line for 500us. 369 1.1 minoura */ 370 1.1 minoura void 371 1.37 tsutsui spc_scsi_reset(struct spc_softc *sc) 372 1.1 minoura { 373 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 374 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 375 1.1 minoura 376 1.1 minoura SPC_TRACE(("spc_scsi_reset ")); 377 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 378 1.15 tsutsui bus_space_read_1(iot, ioh, SCMD) | SCMD_RST); 379 1.1 minoura delay(500); 380 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 381 1.15 tsutsui bus_space_read_1(iot, ioh, SCMD) & ~SCMD_RST); 382 1.1 minoura delay(50); 383 1.1 minoura } 384 1.1 minoura 385 1.1 minoura /* 386 1.1 minoura * Initialize spc SCSI driver. 387 1.1 minoura */ 388 1.1 minoura void 389 1.37 tsutsui spc_init(struct spc_softc *sc, int bus_reset) 390 1.1 minoura { 391 1.1 minoura struct spc_acb *acb; 392 1.1 minoura int r; 393 1.1 minoura 394 1.1 minoura SPC_TRACE(("spc_init ")); 395 1.29 mycroft if (bus_reset) { 396 1.29 mycroft spc_reset(sc); 397 1.29 mycroft spc_scsi_reset(sc); 398 1.29 mycroft } 399 1.1 minoura spc_reset(sc); 400 1.1 minoura 401 1.1 minoura if (sc->sc_state == SPC_INIT) { 402 1.1 minoura /* First time through; initialize. */ 403 1.1 minoura TAILQ_INIT(&sc->ready_list); 404 1.1 minoura TAILQ_INIT(&sc->nexus_list); 405 1.1 minoura TAILQ_INIT(&sc->free_list); 406 1.1 minoura sc->sc_nexus = NULL; 407 1.1 minoura acb = sc->sc_acb; 408 1.8 thorpej memset(acb, 0, sizeof(sc->sc_acb)); 409 1.1 minoura for (r = 0; r < sizeof(sc->sc_acb) / sizeof(*acb); r++) { 410 1.1 minoura TAILQ_INSERT_TAIL(&sc->free_list, acb, chain); 411 1.1 minoura acb++; 412 1.1 minoura } 413 1.8 thorpej memset(&sc->sc_tinfo, 0, sizeof(sc->sc_tinfo)); 414 1.1 minoura } else { 415 1.1 minoura /* Cancel any active commands. */ 416 1.1 minoura sc->sc_state = SPC_CLEANING; 417 1.1 minoura if ((acb = sc->sc_nexus) != NULL) { 418 1.1 minoura acb->xs->error = XS_DRIVER_STUFFUP; 419 1.5 thorpej callout_stop(&acb->xs->xs_callout); 420 1.1 minoura spc_done(sc, acb); 421 1.1 minoura } 422 1.15 tsutsui while ((acb = TAILQ_FIRST(&sc->nexus_list)) != NULL) { 423 1.1 minoura acb->xs->error = XS_DRIVER_STUFFUP; 424 1.5 thorpej callout_stop(&acb->xs->xs_callout); 425 1.1 minoura spc_done(sc, acb); 426 1.1 minoura } 427 1.1 minoura } 428 1.1 minoura 429 1.1 minoura sc->sc_prevphase = PH_INVALID; 430 1.1 minoura for (r = 0; r < 8; r++) { 431 1.1 minoura struct spc_tinfo *ti = &sc->sc_tinfo[r]; 432 1.1 minoura 433 1.1 minoura ti->flags = 0; 434 1.1 minoura #if SPC_USE_SYNCHRONOUS 435 1.1 minoura ti->flags |= DO_SYNC; 436 1.1 minoura ti->period = sc->sc_minsync; 437 1.1 minoura ti->offset = SPC_SYNC_REQ_ACK_OFS; 438 1.1 minoura #else 439 1.1 minoura ti->period = ti->offset = 0; 440 1.1 minoura #endif 441 1.1 minoura #if SPC_USE_WIDE 442 1.1 minoura ti->flags |= DO_WIDE; 443 1.1 minoura ti->width = SPC_MAX_WIDTH; 444 1.1 minoura #else 445 1.1 minoura ti->width = 0; 446 1.1 minoura #endif 447 1.1 minoura } 448 1.1 minoura 449 1.1 minoura sc->sc_state = SPC_IDLE; 450 1.1 minoura bus_space_write_1(sc->sc_iot, sc->sc_ioh, SCTL, 451 1.1 minoura bus_space_read_1(sc->sc_iot, sc->sc_ioh, SCTL) | SCTL_INTR_ENAB); 452 1.1 minoura } 453 1.1 minoura 454 1.1 minoura void 455 1.45 christos spc_free_acb(struct spc_softc *sc, struct spc_acb *acb, int flags) 456 1.1 minoura { 457 1.1 minoura int s; 458 1.1 minoura 459 1.1 minoura SPC_TRACE(("spc_free_acb ")); 460 1.1 minoura s = splbio(); 461 1.1 minoura 462 1.1 minoura acb->flags = 0; 463 1.1 minoura TAILQ_INSERT_HEAD(&sc->free_list, acb, chain); 464 1.1 minoura splx(s); 465 1.1 minoura } 466 1.1 minoura 467 1.1 minoura struct spc_acb * 468 1.37 tsutsui spc_get_acb(struct spc_softc *sc) 469 1.1 minoura { 470 1.1 minoura struct spc_acb *acb; 471 1.1 minoura int s; 472 1.1 minoura 473 1.1 minoura SPC_TRACE(("spc_get_acb ")); 474 1.1 minoura s = splbio(); 475 1.6 bouyer acb = TAILQ_FIRST(&sc->free_list); 476 1.6 bouyer if (acb != NULL) { 477 1.1 minoura TAILQ_REMOVE(&sc->free_list, acb, chain); 478 1.1 minoura acb->flags |= ACB_ALLOC; 479 1.1 minoura } 480 1.1 minoura splx(s); 481 1.1 minoura return acb; 482 1.1 minoura } 483 1.16 tsutsui 484 1.1 minoura /* 485 1.1 minoura * DRIVER FUNCTIONS CALLABLE FROM HIGHER LEVEL DRIVERS 486 1.1 minoura */ 487 1.1 minoura 488 1.1 minoura /* 489 1.1 minoura * Expected sequence: 490 1.1 minoura * 1) Command inserted into ready list 491 1.1 minoura * 2) Command selected for execution 492 1.1 minoura * 3) Command won arbitration and has selected target device 493 1.1 minoura * 4) Send message out (identify message, eventually also sync.negotiations) 494 1.1 minoura * 5) Send command 495 1.1 minoura * 5a) Receive disconnect message, disconnect. 496 1.1 minoura * 5b) Reselected by target 497 1.1 minoura * 5c) Receive identify message from target. 498 1.1 minoura * 6) Send or receive data 499 1.1 minoura * 7) Receive status 500 1.1 minoura * 8) Receive message (command complete etc.) 501 1.1 minoura */ 502 1.1 minoura 503 1.1 minoura /* 504 1.1 minoura * Start a SCSI-command 505 1.1 minoura * This function is called by the higher level SCSI-driver to queue/run 506 1.1 minoura * SCSI-commands. 507 1.1 minoura */ 508 1.6 bouyer void 509 1.37 tsutsui spc_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req, 510 1.37 tsutsui void *arg) 511 1.6 bouyer { 512 1.1 minoura struct scsipi_xfer *xs; 513 1.54 christos struct scsipi_periph *periph __diagused; 514 1.47 tsutsui struct spc_softc *sc = device_private(chan->chan_adapter->adapt_dev); 515 1.1 minoura struct spc_acb *acb; 516 1.1 minoura int s, flags; 517 1.1 minoura 518 1.6 bouyer switch (req) { 519 1.6 bouyer case ADAPTER_REQ_RUN_XFER: 520 1.6 bouyer xs = arg; 521 1.6 bouyer periph = xs->xs_periph; 522 1.6 bouyer SPC_TRACE(("spc_scsipi_request ")); 523 1.6 bouyer SPC_CMDS(("[0x%x, %d]->%d ", (int)xs->cmd->opcode, xs->cmdlen, 524 1.6 bouyer periph->periph_target)); 525 1.6 bouyer 526 1.6 bouyer flags = xs->xs_control; 527 1.19 tsutsui acb = spc_get_acb(sc); 528 1.19 tsutsui #ifdef DIAGNOSTIC 529 1.19 tsutsui /* 530 1.19 tsutsui * This should nerver happen as we track the resources 531 1.19 tsutsui * in the mid-layer. 532 1.19 tsutsui */ 533 1.19 tsutsui if (acb == NULL) { 534 1.19 tsutsui scsipi_printaddr(periph); 535 1.19 tsutsui printf("unable to allocate acb\n"); 536 1.19 tsutsui panic("spc_scsipi_request"); 537 1.6 bouyer } 538 1.19 tsutsui #endif 539 1.6 bouyer 540 1.6 bouyer /* Initialize acb */ 541 1.6 bouyer acb->xs = xs; 542 1.6 bouyer acb->timeout = xs->timeout; 543 1.6 bouyer 544 1.6 bouyer if (xs->xs_control & XS_CTL_RESET) { 545 1.6 bouyer acb->flags |= ACB_RESET; 546 1.6 bouyer acb->scsipi_cmd_length = 0; 547 1.6 bouyer acb->data_length = 0; 548 1.6 bouyer } else { 549 1.7 thorpej memcpy(&acb->scsipi_cmd, xs->cmd, xs->cmdlen); 550 1.6 bouyer acb->scsipi_cmd_length = xs->cmdlen; 551 1.6 bouyer acb->data_addr = xs->data; 552 1.6 bouyer acb->data_length = xs->datalen; 553 1.6 bouyer } 554 1.6 bouyer acb->target_stat = 0; 555 1.1 minoura 556 1.6 bouyer s = splbio(); 557 1.1 minoura 558 1.6 bouyer TAILQ_INSERT_TAIL(&sc->ready_list, acb, chain); 559 1.6 bouyer /* 560 1.6 bouyer * Start scheduling unless a queue process is in progress. 561 1.6 bouyer */ 562 1.6 bouyer if (sc->sc_state == SPC_IDLE) 563 1.6 bouyer spc_sched(sc); 564 1.6 bouyer /* 565 1.6 bouyer * After successful sending, check if we should return just now. 566 1.6 bouyer * If so, return SUCCESSFULLY_QUEUED. 567 1.6 bouyer */ 568 1.1 minoura 569 1.6 bouyer splx(s); 570 1.1 minoura 571 1.6 bouyer if ((flags & XS_CTL_POLL) == 0) 572 1.6 bouyer return; 573 1.1 minoura 574 1.6 bouyer /* Not allowed to use interrupts, use polling instead */ 575 1.6 bouyer s = splbio(); 576 1.6 bouyer if (spc_poll(sc, xs, acb->timeout)) { 577 1.1 minoura spc_timeout(acb); 578 1.6 bouyer if (spc_poll(sc, xs, acb->timeout)) 579 1.6 bouyer spc_timeout(acb); 580 1.6 bouyer } 581 1.6 bouyer splx(s); 582 1.6 bouyer return; 583 1.6 bouyer case ADAPTER_REQ_GROW_RESOURCES: 584 1.6 bouyer /* XXX Not supported. */ 585 1.6 bouyer return; 586 1.6 bouyer case ADAPTER_REQ_SET_XFER_MODE: 587 1.22 tsutsui { 588 1.22 tsutsui /* 589 1.22 tsutsui * We don't support Sync, Wide, or Tagged Command Queuing. 590 1.22 tsutsui * Just callback now, to report this. 591 1.22 tsutsui */ 592 1.22 tsutsui struct scsipi_xfer_mode *xm = arg; 593 1.22 tsutsui 594 1.22 tsutsui xm->xm_mode = 0; 595 1.22 tsutsui xm->xm_period = 0; 596 1.22 tsutsui xm->xm_offset = 0; 597 1.22 tsutsui scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm); 598 1.6 bouyer return; 599 1.22 tsutsui } 600 1.1 minoura } 601 1.1 minoura } 602 1.1 minoura 603 1.1 minoura /* 604 1.1 minoura * Used when interrupt driven I/O isn't allowed, e.g. during boot. 605 1.1 minoura */ 606 1.1 minoura int 607 1.37 tsutsui spc_poll(struct spc_softc *sc, struct scsipi_xfer *xs, int count) 608 1.1 minoura { 609 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 610 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 611 1.1 minoura 612 1.1 minoura SPC_TRACE(("spc_poll ")); 613 1.1 minoura while (count) { 614 1.1 minoura /* 615 1.1 minoura * If we had interrupts enabled, would we 616 1.1 minoura * have got an interrupt? 617 1.1 minoura */ 618 1.1 minoura if (bus_space_read_1(iot, ioh, INTS) != 0) 619 1.17 tsutsui spc_intr(sc); 620 1.4 thorpej if ((xs->xs_status & XS_STS_DONE) != 0) 621 1.1 minoura return 0; 622 1.1 minoura delay(1000); 623 1.1 minoura count--; 624 1.1 minoura } 625 1.1 minoura return 1; 626 1.1 minoura } 627 1.16 tsutsui 628 1.1 minoura /* 629 1.1 minoura * LOW LEVEL SCSI UTILITIES 630 1.1 minoura */ 631 1.1 minoura 632 1.1 minoura integrate void 633 1.47 tsutsui spc_sched_msgout(struct spc_softc *sc, uint8_t m) 634 1.1 minoura { 635 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 636 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 637 1.1 minoura 638 1.1 minoura SPC_TRACE(("spc_sched_msgout ")); 639 1.1 minoura if (sc->sc_msgpriq == 0) 640 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ATN); 641 1.1 minoura sc->sc_msgpriq |= m; 642 1.1 minoura } 643 1.1 minoura 644 1.1 minoura /* 645 1.1 minoura * Set synchronous transfer offset and period. 646 1.1 minoura */ 647 1.1 minoura integrate void 648 1.45 christos spc_setsync(struct spc_softc *sc, struct spc_tinfo *ti) 649 1.1 minoura { 650 1.1 minoura #if SPC_USE_SYNCHRONOUS 651 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 652 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 653 1.1 minoura 654 1.1 minoura SPC_TRACE(("spc_setsync ")); 655 1.1 minoura if (ti->offset != 0) 656 1.1 minoura bus_space_write_1(iot, ioh, TMOD, 657 1.1 minoura ((ti->period * sc->sc_freq) / 250 - 2) << 4 | ti->offset); 658 1.1 minoura else 659 1.1 minoura bus_space_write_1(iot, ioh, TMOD, 0); 660 1.1 minoura #endif 661 1.1 minoura } 662 1.1 minoura 663 1.1 minoura /* 664 1.6 bouyer * Start a selection. This is used by spc_sched() to select an idle target. 665 1.1 minoura */ 666 1.1 minoura void 667 1.37 tsutsui spc_select(struct spc_softc *sc, struct spc_acb *acb) 668 1.1 minoura { 669 1.6 bouyer struct scsipi_periph *periph = acb->xs->xs_periph; 670 1.6 bouyer int target = periph->periph_target; 671 1.1 minoura struct spc_tinfo *ti = &sc->sc_tinfo[target]; 672 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 673 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 674 1.1 minoura 675 1.1 minoura SPC_TRACE(("spc_select ")); 676 1.1 minoura spc_setsync(sc, ti); 677 1.1 minoura 678 1.1 minoura #if 0 679 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ATN); 680 1.1 minoura #endif 681 1.1 minoura 682 1.1 minoura bus_space_write_1(iot, ioh, PCTL, 0); 683 1.15 tsutsui bus_space_write_1(iot, ioh, TEMP, 684 1.15 tsutsui (1 << sc->sc_initiator) | (1 << target)); 685 1.1 minoura /* 686 1.2 minoura * Setup BSY timeout (selection timeout). 687 1.2 minoura * 250ms according to the SCSI specification. 688 1.2 minoura * T = (X * 256 + 15) * Tclf * 2 (Tclf = 200ns on x68k) 689 1.2 minoura * To setup 256ms timeout, 690 1.1 minoura * 128000ns/200ns = X * 256 + 15 691 1.1 minoura * 640 - 15 = X * 256 692 1.1 minoura * X = 625 / 256 693 1.1 minoura * X = 2 + 113 / 256 694 1.2 minoura * ==> tch = 2, tcm = 113 (correct?) 695 1.1 minoura */ 696 1.22 tsutsui /* Time to the information transfer phase start. */ 697 1.22 tsutsui /* XXX These values should be calculated from sc_freq */ 698 1.1 minoura bus_space_write_1(iot, ioh, TCH, 2); 699 1.1 minoura bus_space_write_1(iot, ioh, TCM, 113); 700 1.1 minoura bus_space_write_1(iot, ioh, TCL, 3); 701 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_SELECT); 702 1.1 minoura 703 1.1 minoura sc->sc_state = SPC_SELECTING; 704 1.1 minoura } 705 1.1 minoura 706 1.1 minoura int 707 1.37 tsutsui spc_reselect(struct spc_softc *sc, int message) 708 1.1 minoura { 709 1.47 tsutsui uint8_t selid, target, lun; 710 1.1 minoura struct spc_acb *acb; 711 1.6 bouyer struct scsipi_periph *periph; 712 1.1 minoura struct spc_tinfo *ti; 713 1.1 minoura 714 1.1 minoura SPC_TRACE(("spc_reselect ")); 715 1.1 minoura /* 716 1.1 minoura * The SCSI chip made a snapshot of the data bus while the reselection 717 1.1 minoura * was being negotiated. This enables us to determine which target did 718 1.1 minoura * the reselect. 719 1.1 minoura */ 720 1.1 minoura selid = sc->sc_selid & ~(1 << sc->sc_initiator); 721 1.1 minoura if (selid & (selid - 1)) { 722 1.15 tsutsui printf("%s: reselect with invalid selid %02x; " 723 1.47 tsutsui "sending DEVICE RESET\n", device_xname(sc->sc_dev), selid); 724 1.1 minoura SPC_BREAK(); 725 1.1 minoura goto reset; 726 1.1 minoura } 727 1.1 minoura 728 1.1 minoura /* 729 1.1 minoura * Search wait queue for disconnected cmd 730 1.1 minoura * The list should be short, so I haven't bothered with 731 1.1 minoura * any more sophisticated structures than a simple 732 1.1 minoura * singly linked list. 733 1.1 minoura */ 734 1.1 minoura target = ffs(selid) - 1; 735 1.1 minoura lun = message & 0x07; 736 1.15 tsutsui TAILQ_FOREACH(acb, &sc->nexus_list, chain) { 737 1.6 bouyer periph = acb->xs->xs_periph; 738 1.6 bouyer if (periph->periph_target == target && 739 1.6 bouyer periph->periph_lun == lun) 740 1.1 minoura break; 741 1.1 minoura } 742 1.1 minoura if (acb == NULL) { 743 1.15 tsutsui printf("%s: reselect from target %d lun %d with no nexus; " 744 1.47 tsutsui "sending ABORT\n", device_xname(sc->sc_dev), target, lun); 745 1.1 minoura SPC_BREAK(); 746 1.1 minoura goto abort; 747 1.1 minoura } 748 1.1 minoura 749 1.1 minoura /* Make this nexus active again. */ 750 1.1 minoura TAILQ_REMOVE(&sc->nexus_list, acb, chain); 751 1.1 minoura sc->sc_state = SPC_CONNECTED; 752 1.1 minoura sc->sc_nexus = acb; 753 1.1 minoura ti = &sc->sc_tinfo[target]; 754 1.1 minoura ti->lubusy |= (1 << lun); 755 1.1 minoura spc_setsync(sc, ti); 756 1.1 minoura 757 1.1 minoura if (acb->flags & ACB_RESET) 758 1.1 minoura spc_sched_msgout(sc, SEND_DEV_RESET); 759 1.1 minoura else if (acb->flags & ACB_ABORT) 760 1.1 minoura spc_sched_msgout(sc, SEND_ABORT); 761 1.1 minoura 762 1.1 minoura /* Do an implicit RESTORE POINTERS. */ 763 1.1 minoura sc->sc_dp = acb->data_addr; 764 1.1 minoura sc->sc_dleft = acb->data_length; 765 1.47 tsutsui sc->sc_cp = (uint8_t *)&acb->scsipi_cmd; 766 1.1 minoura sc->sc_cleft = acb->scsipi_cmd_length; 767 1.1 minoura 768 1.1 minoura return (0); 769 1.1 minoura 770 1.1 minoura reset: 771 1.1 minoura spc_sched_msgout(sc, SEND_DEV_RESET); 772 1.1 minoura return (1); 773 1.1 minoura 774 1.1 minoura abort: 775 1.1 minoura spc_sched_msgout(sc, SEND_ABORT); 776 1.1 minoura return (1); 777 1.1 minoura } 778 1.16 tsutsui 779 1.1 minoura /* 780 1.1 minoura * Schedule a SCSI operation. This has now been pulled out of the interrupt 781 1.1 minoura * handler so that we may call it from spc_scsi_cmd and spc_done. This may 782 1.25 wiz * save us an unnecessary interrupt just to get things going. Should only be 783 1.1 minoura * called when state == SPC_IDLE and at bio pl. 784 1.1 minoura */ 785 1.1 minoura void 786 1.37 tsutsui spc_sched(struct spc_softc *sc) 787 1.1 minoura { 788 1.1 minoura struct spc_acb *acb; 789 1.6 bouyer struct scsipi_periph *periph; 790 1.1 minoura struct spc_tinfo *ti; 791 1.1 minoura 792 1.1 minoura /* missing the hw, just return and wait for our hw */ 793 1.1 minoura if (sc->sc_flags & SPC_INACTIVE) 794 1.1 minoura return; 795 1.1 minoura SPC_TRACE(("spc_sched ")); 796 1.1 minoura /* 797 1.1 minoura * Find first acb in ready queue that is for a target/lunit pair that 798 1.1 minoura * is not busy. 799 1.1 minoura */ 800 1.15 tsutsui TAILQ_FOREACH(acb, &sc->ready_list, chain) { 801 1.6 bouyer periph = acb->xs->xs_periph; 802 1.6 bouyer ti = &sc->sc_tinfo[periph->periph_target]; 803 1.6 bouyer if ((ti->lubusy & (1 << periph->periph_lun)) == 0) { 804 1.1 minoura SPC_MISC(("selecting %d:%d ", 805 1.6 bouyer periph->periph_target, periph->periph_lun)); 806 1.1 minoura TAILQ_REMOVE(&sc->ready_list, acb, chain); 807 1.1 minoura sc->sc_nexus = acb; 808 1.1 minoura spc_select(sc, acb); 809 1.1 minoura return; 810 1.43 christos } else { 811 1.1 minoura SPC_MISC(("%d:%d busy\n", 812 1.6 bouyer periph->periph_target, periph->periph_lun)); 813 1.43 christos } 814 1.1 minoura } 815 1.1 minoura SPC_MISC(("idle ")); 816 1.1 minoura /* Nothing to start; just enable reselections and wait. */ 817 1.1 minoura } 818 1.16 tsutsui 819 1.1 minoura /* 820 1.1 minoura * POST PROCESSING OF SCSI_CMD (usually current) 821 1.1 minoura */ 822 1.1 minoura void 823 1.37 tsutsui spc_done(struct spc_softc *sc, struct spc_acb *acb) 824 1.1 minoura { 825 1.1 minoura struct scsipi_xfer *xs = acb->xs; 826 1.6 bouyer struct scsipi_periph *periph = xs->xs_periph; 827 1.6 bouyer struct spc_tinfo *ti = &sc->sc_tinfo[periph->periph_target]; 828 1.1 minoura 829 1.1 minoura SPC_TRACE(("spc_done ")); 830 1.1 minoura 831 1.1 minoura if (xs->error == XS_NOERROR) { 832 1.1 minoura if (acb->flags & ACB_ABORT) { 833 1.1 minoura xs->error = XS_DRIVER_STUFFUP; 834 1.1 minoura } else { 835 1.1 minoura switch (acb->target_stat) { 836 1.1 minoura case SCSI_CHECK: 837 1.1 minoura /* First, save the return values */ 838 1.1 minoura xs->resid = acb->data_length; 839 1.19 tsutsui /* FALLTHROUGH */ 840 1.6 bouyer case SCSI_BUSY: 841 1.1 minoura xs->status = acb->target_stat; 842 1.1 minoura xs->error = XS_BUSY; 843 1.1 minoura break; 844 1.1 minoura case SCSI_OK: 845 1.1 minoura xs->resid = acb->data_length; 846 1.1 minoura break; 847 1.1 minoura default: 848 1.1 minoura xs->error = XS_DRIVER_STUFFUP; 849 1.1 minoura #if SPC_DEBUG 850 1.1 minoura printf("%s: spc_done: bad stat 0x%x\n", 851 1.47 tsutsui device_xname(sc->sc_dev), acb->target_stat); 852 1.1 minoura #endif 853 1.1 minoura break; 854 1.1 minoura } 855 1.1 minoura } 856 1.1 minoura } 857 1.1 minoura 858 1.1 minoura #if SPC_DEBUG 859 1.1 minoura if ((spc_debug & SPC_SHOWMISC) != 0) { 860 1.1 minoura if (xs->resid != 0) 861 1.1 minoura printf("resid=%d ", xs->resid); 862 1.1 minoura else 863 1.1 minoura printf("error=%d\n", xs->error); 864 1.1 minoura } 865 1.1 minoura #endif 866 1.1 minoura 867 1.1 minoura /* 868 1.1 minoura * Remove the ACB from whatever queue it happens to be on. 869 1.1 minoura */ 870 1.1 minoura if (acb->flags & ACB_NEXUS) 871 1.6 bouyer ti->lubusy &= ~(1 << periph->periph_lun); 872 1.1 minoura if (acb == sc->sc_nexus) { 873 1.1 minoura sc->sc_nexus = NULL; 874 1.1 minoura sc->sc_state = SPC_IDLE; 875 1.1 minoura spc_sched(sc); 876 1.1 minoura } else 877 1.1 minoura spc_dequeue(sc, acb); 878 1.1 minoura 879 1.4 thorpej spc_free_acb(sc, acb, xs->xs_control); 880 1.1 minoura ti->cmds++; 881 1.1 minoura scsipi_done(xs); 882 1.1 minoura } 883 1.1 minoura 884 1.1 minoura void 885 1.37 tsutsui spc_dequeue(struct spc_softc *sc, struct spc_acb *acb) 886 1.1 minoura { 887 1.1 minoura 888 1.1 minoura SPC_TRACE(("spc_dequeue ")); 889 1.15 tsutsui if (acb->flags & ACB_NEXUS) 890 1.1 minoura TAILQ_REMOVE(&sc->nexus_list, acb, chain); 891 1.15 tsutsui else 892 1.1 minoura TAILQ_REMOVE(&sc->ready_list, acb, chain); 893 1.1 minoura } 894 1.16 tsutsui 895 1.1 minoura /* 896 1.1 minoura * INTERRUPT/PROTOCOL ENGINE 897 1.1 minoura */ 898 1.1 minoura 899 1.1 minoura /* 900 1.1 minoura * Precondition: 901 1.1 minoura * The SCSI bus is already in the MSGI phase and there is a message byte 902 1.1 minoura * on the bus, along with an asserted REQ signal. 903 1.1 minoura */ 904 1.1 minoura void 905 1.37 tsutsui spc_msgin(struct spc_softc *sc) 906 1.1 minoura { 907 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 908 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 909 1.1 minoura int n; 910 1.38 tsutsui uint8_t msg; 911 1.1 minoura 912 1.1 minoura SPC_TRACE(("spc_msgin ")); 913 1.1 minoura 914 1.1 minoura if (sc->sc_prevphase == PH_MSGIN) { 915 1.1 minoura /* This is a continuation of the previous message. */ 916 1.1 minoura n = sc->sc_imp - sc->sc_imess; 917 1.1 minoura goto nextbyte; 918 1.1 minoura } 919 1.1 minoura 920 1.1 minoura /* This is a new MESSAGE IN phase. Clean up our state. */ 921 1.1 minoura sc->sc_flags &= ~SPC_DROP_MSGIN; 922 1.1 minoura 923 1.1 minoura nextmsg: 924 1.1 minoura n = 0; 925 1.1 minoura sc->sc_imp = &sc->sc_imess[n]; 926 1.1 minoura 927 1.1 minoura nextbyte: 928 1.1 minoura /* 929 1.1 minoura * Read a whole message, but don't ack the last byte. If we reject the 930 1.1 minoura * message, we have to assert ATN during the message transfer phase 931 1.1 minoura * itself. 932 1.1 minoura */ 933 1.1 minoura for (;;) { 934 1.21 tsutsui #ifdef NO_MANUAL_XFER /* XXX */ 935 1.58 tsutsui uint8_t intstat; 936 1.21 tsutsui if (bus_space_read_1(iot, ioh, INTS) != 0) { 937 1.21 tsutsui /* 938 1.21 tsutsui * Target left MESSAGE IN, probably because it 939 1.21 tsutsui * a) noticed our ATN signal, or 940 1.21 tsutsui * b) ran out of messages. 941 1.21 tsutsui */ 942 1.21 tsutsui goto out; 943 1.21 tsutsui } 944 1.21 tsutsui #endif 945 1.1 minoura /* If parity error, just dump everything on the floor. */ 946 1.1 minoura if ((bus_space_read_1(iot, ioh, SERR) & 947 1.1 minoura (SERR_SCSI_PAR|SERR_SPC_PAR)) != 0) { 948 1.1 minoura sc->sc_flags |= SPC_DROP_MSGIN; 949 1.1 minoura spc_sched_msgout(sc, SEND_PARITY_ERROR); 950 1.1 minoura } 951 1.1 minoura 952 1.21 tsutsui #ifdef NO_MANUAL_XFER /* XXX */ 953 1.21 tsutsui /* send TRANSFER command. */ 954 1.21 tsutsui bus_space_write_1(iot, ioh, TCH, 0); 955 1.21 tsutsui bus_space_write_1(iot, ioh, TCM, 0); 956 1.21 tsutsui bus_space_write_1(iot, ioh, TCL, 1); 957 1.21 tsutsui bus_space_write_1(iot, ioh, PCTL, 958 1.21 tsutsui sc->sc_phase | PCTL_BFINT_ENAB); 959 1.21 tsutsui #ifdef NEED_DREQ_ON_HARDWARE_XFER 960 1.21 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_XFR); 961 1.21 tsutsui #else 962 1.21 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_XFR | SCMD_PROG_XFR); 963 1.21 tsutsui #endif 964 1.58 tsutsui intstat = 0; 965 1.21 tsutsui for (;;) { 966 1.21 tsutsui if ((bus_space_read_1(iot, ioh, SSTS) & 967 1.21 tsutsui SSTS_DREG_EMPTY) == 0) 968 1.21 tsutsui break; 969 1.58 tsutsui /* 970 1.58 tsutsui * We have to read INTS before checking SSTS to avoid 971 1.58 tsutsui * race between SSTS_DREG_EMPTY and INTS_CMD_DONE. 972 1.58 tsutsui */ 973 1.58 tsutsui if (intstat != 0) 974 1.21 tsutsui goto out; 975 1.58 tsutsui intstat = bus_space_read_1(iot, ioh, INTS); 976 1.21 tsutsui } 977 1.21 tsutsui msg = bus_space_read_1(iot, ioh, DREG); 978 1.21 tsutsui #else 979 1.20 tsutsui if ((bus_space_read_1(iot, ioh, PSNS) & PSNS_ATN) != 0) 980 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ATN); 981 1.35 tsutsui bus_space_write_1(iot, ioh, PCTL, PCTL_BFINT_ENAB | PH_MSGIN); 982 1.20 tsutsui 983 1.20 tsutsui while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0) { 984 1.20 tsutsui if ((bus_space_read_1(iot, ioh, PSNS) & PH_MASK) 985 1.35 tsutsui != PH_MSGIN || 986 1.35 tsutsui bus_space_read_1(iot, ioh, INTS) != 0) 987 1.21 tsutsui /* 988 1.21 tsutsui * Target left MESSAGE IN, probably because it 989 1.21 tsutsui * a) noticed our ATN signal, or 990 1.21 tsutsui * b) ran out of messages. 991 1.21 tsutsui */ 992 1.1 minoura goto out; 993 1.36 tsutsui DELAY(1); /* XXX needs timeout */ 994 1.1 minoura } 995 1.1 minoura 996 1.21 tsutsui msg = bus_space_read_1(iot, ioh, TEMP); 997 1.21 tsutsui #endif 998 1.20 tsutsui 999 1.1 minoura /* Gather incoming message bytes if needed. */ 1000 1.1 minoura if ((sc->sc_flags & SPC_DROP_MSGIN) == 0) { 1001 1.1 minoura if (n >= SPC_MAX_MSG_LEN) { 1002 1.1 minoura sc->sc_flags |= SPC_DROP_MSGIN; 1003 1.1 minoura spc_sched_msgout(sc, SEND_REJECT); 1004 1.1 minoura } else { 1005 1.21 tsutsui *sc->sc_imp++ = msg; 1006 1.1 minoura n++; 1007 1.1 minoura /* 1008 1.1 minoura * This testing is suboptimal, but most 1009 1.1 minoura * messages will be of the one byte variety, so 1010 1.1 minoura * it should not affect performance 1011 1.1 minoura * significantly. 1012 1.1 minoura */ 1013 1.9 tsutsui if (n == 1 && MSG_IS1BYTE(sc->sc_imess[0])) 1014 1.1 minoura break; 1015 1.9 tsutsui if (n == 2 && MSG_IS2BYTE(sc->sc_imess[0])) 1016 1.1 minoura break; 1017 1.9 tsutsui if (n >= 3 && MSG_ISEXTENDED(sc->sc_imess[0]) && 1018 1.1 minoura n == sc->sc_imess[1] + 2) 1019 1.1 minoura break; 1020 1.1 minoura } 1021 1.21 tsutsui } 1022 1.1 minoura /* 1023 1.1 minoura * If we reach this spot we're either: 1024 1.1 minoura * a) in the middle of a multi-byte message, or 1025 1.1 minoura * b) dropping bytes. 1026 1.1 minoura */ 1027 1.20 tsutsui 1028 1.21 tsutsui #ifndef NO_MANUAL_XFER /* XXX */ 1029 1.1 minoura /* Ack the last byte read. */ 1030 1.27 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ACK); 1031 1.27 tsutsui while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0) 1032 1.36 tsutsui DELAY(1); /* XXX needs timeout */ 1033 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK); 1034 1.21 tsutsui #endif 1035 1.1 minoura } 1036 1.1 minoura 1037 1.1 minoura SPC_MISC(("n=%d imess=0x%02x ", n, sc->sc_imess[0])); 1038 1.1 minoura 1039 1.1 minoura /* We now have a complete message. Parse it. */ 1040 1.1 minoura switch (sc->sc_state) { 1041 1.1 minoura struct spc_acb *acb; 1042 1.1 minoura struct spc_tinfo *ti; 1043 1.1 minoura 1044 1.1 minoura case SPC_CONNECTED: 1045 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1046 1.1 minoura acb = sc->sc_nexus; 1047 1.6 bouyer ti = &sc->sc_tinfo[acb->xs->xs_periph->periph_target]; 1048 1.1 minoura 1049 1.1 minoura switch (sc->sc_imess[0]) { 1050 1.1 minoura case MSG_CMDCOMPLETE: 1051 1.41 christos #if 0 1052 1.1 minoura if (sc->sc_dleft < 0) { 1053 1.6 bouyer periph = acb->xs->xs_periph; 1054 1.28 mycroft printf("%s: %ld extra bytes from %d:%d\n", 1055 1.47 tsutsui device_xname(sc->sc_dev), 1056 1.47 tsutsui (long)-sc->sc_dleft, 1057 1.6 bouyer periph->periph_target, periph->periph_lun); 1058 1.19 tsutsui sc->sc_dleft = 0; 1059 1.1 minoura } 1060 1.41 christos #endif 1061 1.1 minoura acb->xs->resid = acb->data_length = sc->sc_dleft; 1062 1.1 minoura sc->sc_state = SPC_CMDCOMPLETE; 1063 1.1 minoura break; 1064 1.1 minoura 1065 1.1 minoura case MSG_PARITY_ERROR: 1066 1.1 minoura /* Resend the last message. */ 1067 1.1 minoura spc_sched_msgout(sc, sc->sc_lastmsg); 1068 1.1 minoura break; 1069 1.1 minoura 1070 1.1 minoura case MSG_MESSAGE_REJECT: 1071 1.1 minoura SPC_MISC(("message rejected %02x ", sc->sc_lastmsg)); 1072 1.1 minoura switch (sc->sc_lastmsg) { 1073 1.1 minoura #if SPC_USE_SYNCHRONOUS + SPC_USE_WIDE 1074 1.1 minoura case SEND_IDENTIFY: 1075 1.1 minoura ti->flags &= ~(DO_SYNC | DO_WIDE); 1076 1.1 minoura ti->period = ti->offset = 0; 1077 1.1 minoura spc_setsync(sc, ti); 1078 1.1 minoura ti->width = 0; 1079 1.1 minoura break; 1080 1.1 minoura #endif 1081 1.1 minoura #if SPC_USE_SYNCHRONOUS 1082 1.1 minoura case SEND_SDTR: 1083 1.1 minoura ti->flags &= ~DO_SYNC; 1084 1.1 minoura ti->period = ti->offset = 0; 1085 1.1 minoura spc_setsync(sc, ti); 1086 1.1 minoura break; 1087 1.1 minoura #endif 1088 1.1 minoura #if SPC_USE_WIDE 1089 1.1 minoura case SEND_WDTR: 1090 1.1 minoura ti->flags &= ~DO_WIDE; 1091 1.1 minoura ti->width = 0; 1092 1.1 minoura break; 1093 1.1 minoura #endif 1094 1.1 minoura case SEND_INIT_DET_ERR: 1095 1.1 minoura spc_sched_msgout(sc, SEND_ABORT); 1096 1.1 minoura break; 1097 1.1 minoura } 1098 1.1 minoura break; 1099 1.1 minoura 1100 1.1 minoura case MSG_NOOP: 1101 1.1 minoura break; 1102 1.1 minoura 1103 1.1 minoura case MSG_DISCONNECT: 1104 1.1 minoura ti->dconns++; 1105 1.1 minoura sc->sc_state = SPC_DISCONNECT; 1106 1.1 minoura break; 1107 1.1 minoura 1108 1.1 minoura case MSG_SAVEDATAPOINTER: 1109 1.1 minoura acb->data_addr = sc->sc_dp; 1110 1.1 minoura acb->data_length = sc->sc_dleft; 1111 1.1 minoura break; 1112 1.1 minoura 1113 1.1 minoura case MSG_RESTOREPOINTERS: 1114 1.1 minoura sc->sc_dp = acb->data_addr; 1115 1.1 minoura sc->sc_dleft = acb->data_length; 1116 1.47 tsutsui sc->sc_cp = (uint8_t *)&acb->scsipi_cmd; 1117 1.1 minoura sc->sc_cleft = acb->scsipi_cmd_length; 1118 1.1 minoura break; 1119 1.1 minoura 1120 1.1 minoura case MSG_EXTENDED: 1121 1.1 minoura switch (sc->sc_imess[2]) { 1122 1.1 minoura #if SPC_USE_SYNCHRONOUS 1123 1.1 minoura case MSG_EXT_SDTR: 1124 1.1 minoura if (sc->sc_imess[1] != 3) 1125 1.1 minoura goto reject; 1126 1.1 minoura ti->period = sc->sc_imess[3]; 1127 1.1 minoura ti->offset = sc->sc_imess[4]; 1128 1.1 minoura ti->flags &= ~DO_SYNC; 1129 1.1 minoura if (ti->offset == 0) { 1130 1.1 minoura } else if (ti->period < sc->sc_minsync || 1131 1.15 tsutsui ti->period > sc->sc_maxsync || 1132 1.15 tsutsui ti->offset > 8) { 1133 1.1 minoura ti->period = ti->offset = 0; 1134 1.1 minoura spc_sched_msgout(sc, SEND_SDTR); 1135 1.1 minoura } else { 1136 1.6 bouyer scsipi_printaddr(acb->xs->xs_periph); 1137 1.15 tsutsui printf("sync, offset %d, " 1138 1.15 tsutsui "period %dnsec\n", 1139 1.1 minoura ti->offset, ti->period * 4); 1140 1.1 minoura } 1141 1.1 minoura spc_setsync(sc, ti); 1142 1.1 minoura break; 1143 1.1 minoura #endif 1144 1.1 minoura 1145 1.1 minoura #if SPC_USE_WIDE 1146 1.1 minoura case MSG_EXT_WDTR: 1147 1.1 minoura if (sc->sc_imess[1] != 2) 1148 1.1 minoura goto reject; 1149 1.1 minoura ti->width = sc->sc_imess[3]; 1150 1.1 minoura ti->flags &= ~DO_WIDE; 1151 1.1 minoura if (ti->width == 0) { 1152 1.1 minoura } else if (ti->width > SPC_MAX_WIDTH) { 1153 1.1 minoura ti->width = 0; 1154 1.1 minoura spc_sched_msgout(sc, SEND_WDTR); 1155 1.1 minoura } else { 1156 1.6 bouyer scsipi_printaddr(acb->xs->xs_periph); 1157 1.1 minoura printf("wide, width %d\n", 1158 1.1 minoura 1 << (3 + ti->width)); 1159 1.1 minoura } 1160 1.1 minoura break; 1161 1.1 minoura #endif 1162 1.1 minoura 1163 1.1 minoura default: 1164 1.15 tsutsui printf("%s: unrecognized MESSAGE EXTENDED; " 1165 1.47 tsutsui "sending REJECT\n", 1166 1.47 tsutsui device_xname(sc->sc_dev)); 1167 1.1 minoura SPC_BREAK(); 1168 1.1 minoura goto reject; 1169 1.1 minoura } 1170 1.1 minoura break; 1171 1.1 minoura 1172 1.1 minoura default: 1173 1.1 minoura printf("%s: unrecognized MESSAGE; sending REJECT\n", 1174 1.47 tsutsui device_xname(sc->sc_dev)); 1175 1.1 minoura SPC_BREAK(); 1176 1.1 minoura reject: 1177 1.1 minoura spc_sched_msgout(sc, SEND_REJECT); 1178 1.1 minoura break; 1179 1.1 minoura } 1180 1.1 minoura break; 1181 1.1 minoura 1182 1.1 minoura case SPC_RESELECTED: 1183 1.1 minoura if (!MSG_ISIDENTIFY(sc->sc_imess[0])) { 1184 1.15 tsutsui printf("%s: reselect without IDENTIFY; " 1185 1.47 tsutsui "sending DEVICE RESET\n", device_xname(sc->sc_dev)); 1186 1.1 minoura SPC_BREAK(); 1187 1.1 minoura goto reset; 1188 1.1 minoura } 1189 1.1 minoura 1190 1.1 minoura (void) spc_reselect(sc, sc->sc_imess[0]); 1191 1.1 minoura break; 1192 1.1 minoura 1193 1.1 minoura default: 1194 1.1 minoura printf("%s: unexpected MESSAGE IN; sending DEVICE RESET\n", 1195 1.47 tsutsui device_xname(sc->sc_dev)); 1196 1.1 minoura SPC_BREAK(); 1197 1.1 minoura reset: 1198 1.1 minoura spc_sched_msgout(sc, SEND_DEV_RESET); 1199 1.1 minoura break; 1200 1.1 minoura 1201 1.1 minoura #ifdef notdef 1202 1.1 minoura abort: 1203 1.1 minoura spc_sched_msgout(sc, SEND_ABORT); 1204 1.1 minoura break; 1205 1.1 minoura #endif 1206 1.1 minoura } 1207 1.1 minoura 1208 1.21 tsutsui #ifndef NO_MANUAL_XFER /* XXX */ 1209 1.1 minoura /* Ack the last message byte. */ 1210 1.27 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ACK); 1211 1.27 tsutsui while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0) 1212 1.36 tsutsui DELAY(1); /* XXX needs timeout */ 1213 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK); 1214 1.21 tsutsui #endif 1215 1.1 minoura 1216 1.1 minoura /* Go get the next message, if any. */ 1217 1.1 minoura goto nextmsg; 1218 1.1 minoura 1219 1.1 minoura out: 1220 1.27 tsutsui #ifdef NO_MANUAL_XFER /* XXX */ 1221 1.21 tsutsui /* Ack the last message byte. */ 1222 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK); 1223 1.27 tsutsui #endif 1224 1.1 minoura SPC_MISC(("n=%d imess=0x%02x ", n, sc->sc_imess[0])); 1225 1.1 minoura } 1226 1.1 minoura 1227 1.1 minoura /* 1228 1.1 minoura * Send the highest priority, scheduled message. 1229 1.1 minoura */ 1230 1.1 minoura void 1231 1.37 tsutsui spc_msgout(struct spc_softc *sc) 1232 1.1 minoura { 1233 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 1234 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 1235 1.1 minoura #if SPC_USE_SYNCHRONOUS 1236 1.1 minoura struct spc_tinfo *ti; 1237 1.1 minoura #endif 1238 1.1 minoura int n; 1239 1.1 minoura 1240 1.1 minoura SPC_TRACE(("spc_msgout ")); 1241 1.1 minoura 1242 1.1 minoura if (sc->sc_prevphase == PH_MSGOUT) { 1243 1.1 minoura if (sc->sc_omp == sc->sc_omess) { 1244 1.1 minoura /* 1245 1.1 minoura * This is a retransmission. 1246 1.1 minoura * 1247 1.1 minoura * We get here if the target stayed in MESSAGE OUT 1248 1.1 minoura * phase. Section 5.1.9.2 of the SCSI 2 spec indicates 1249 1.1 minoura * that all of the previously transmitted messages must 1250 1.1 minoura * be sent again, in the same order. Therefore, we 1251 1.1 minoura * requeue all the previously transmitted messages, and 1252 1.1 minoura * start again from the top. Our simple priority 1253 1.1 minoura * scheme keeps the messages in the right order. 1254 1.1 minoura */ 1255 1.1 minoura SPC_MISC(("retransmitting ")); 1256 1.1 minoura sc->sc_msgpriq |= sc->sc_msgoutq; 1257 1.1 minoura /* 1258 1.1 minoura * Set ATN. If we're just sending a trivial 1-byte 1259 1.1 minoura * message, we'll clear ATN later on anyway. 1260 1.1 minoura */ 1261 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 1262 1.15 tsutsui SCMD_SET_ATN); /* XXX? */ 1263 1.1 minoura } else { 1264 1.1 minoura /* This is a continuation of the previous message. */ 1265 1.1 minoura n = sc->sc_omp - sc->sc_omess; 1266 1.1 minoura goto nextbyte; 1267 1.1 minoura } 1268 1.1 minoura } 1269 1.1 minoura 1270 1.1 minoura /* No messages transmitted so far. */ 1271 1.1 minoura sc->sc_msgoutq = 0; 1272 1.1 minoura sc->sc_lastmsg = 0; 1273 1.1 minoura 1274 1.1 minoura nextmsg: 1275 1.1 minoura /* Pick up highest priority message. */ 1276 1.1 minoura sc->sc_currmsg = sc->sc_msgpriq & -sc->sc_msgpriq; 1277 1.1 minoura sc->sc_msgpriq &= ~sc->sc_currmsg; 1278 1.1 minoura sc->sc_msgoutq |= sc->sc_currmsg; 1279 1.1 minoura 1280 1.1 minoura /* Build the outgoing message data. */ 1281 1.1 minoura switch (sc->sc_currmsg) { 1282 1.1 minoura case SEND_IDENTIFY: 1283 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1284 1.1 minoura sc->sc_omess[0] = 1285 1.6 bouyer MSG_IDENTIFY(sc->sc_nexus->xs->xs_periph->periph_lun, 1); 1286 1.1 minoura n = 1; 1287 1.1 minoura break; 1288 1.1 minoura 1289 1.1 minoura #if SPC_USE_SYNCHRONOUS 1290 1.1 minoura case SEND_SDTR: 1291 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1292 1.6 bouyer ti = &sc->sc_tinfo[sc->sc_nexus->xs->xs_periph->periph_target]; 1293 1.1 minoura sc->sc_omess[4] = MSG_EXTENDED; 1294 1.15 tsutsui sc->sc_omess[3] = MSG_EXT_SDTR_LEN; 1295 1.1 minoura sc->sc_omess[2] = MSG_EXT_SDTR; 1296 1.1 minoura sc->sc_omess[1] = ti->period >> 2; 1297 1.1 minoura sc->sc_omess[0] = ti->offset; 1298 1.1 minoura n = 5; 1299 1.1 minoura break; 1300 1.1 minoura #endif 1301 1.1 minoura 1302 1.1 minoura #if SPC_USE_WIDE 1303 1.1 minoura case SEND_WDTR: 1304 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1305 1.6 bouyer ti = &sc->sc_tinfo[sc->sc_nexus->xs->xs_periph->periph_target]; 1306 1.1 minoura sc->sc_omess[3] = MSG_EXTENDED; 1307 1.15 tsutsui sc->sc_omess[2] = MSG_EXT_WDTR_LEN; 1308 1.1 minoura sc->sc_omess[1] = MSG_EXT_WDTR; 1309 1.1 minoura sc->sc_omess[0] = ti->width; 1310 1.1 minoura n = 4; 1311 1.1 minoura break; 1312 1.1 minoura #endif 1313 1.1 minoura 1314 1.1 minoura case SEND_DEV_RESET: 1315 1.1 minoura sc->sc_flags |= SPC_ABORTING; 1316 1.1 minoura sc->sc_omess[0] = MSG_BUS_DEV_RESET; 1317 1.1 minoura n = 1; 1318 1.1 minoura break; 1319 1.1 minoura 1320 1.1 minoura case SEND_REJECT: 1321 1.1 minoura sc->sc_omess[0] = MSG_MESSAGE_REJECT; 1322 1.1 minoura n = 1; 1323 1.1 minoura break; 1324 1.1 minoura 1325 1.1 minoura case SEND_PARITY_ERROR: 1326 1.1 minoura sc->sc_omess[0] = MSG_PARITY_ERROR; 1327 1.1 minoura n = 1; 1328 1.1 minoura break; 1329 1.1 minoura 1330 1.1 minoura case SEND_INIT_DET_ERR: 1331 1.1 minoura sc->sc_omess[0] = MSG_INITIATOR_DET_ERR; 1332 1.1 minoura n = 1; 1333 1.1 minoura break; 1334 1.1 minoura 1335 1.1 minoura case SEND_ABORT: 1336 1.1 minoura sc->sc_flags |= SPC_ABORTING; 1337 1.1 minoura sc->sc_omess[0] = MSG_ABORT; 1338 1.1 minoura n = 1; 1339 1.1 minoura break; 1340 1.1 minoura 1341 1.1 minoura default: 1342 1.1 minoura printf("%s: unexpected MESSAGE OUT; sending NOOP\n", 1343 1.47 tsutsui device_xname(sc->sc_dev)); 1344 1.1 minoura SPC_BREAK(); 1345 1.1 minoura sc->sc_omess[0] = MSG_NOOP; 1346 1.1 minoura n = 1; 1347 1.1 minoura break; 1348 1.1 minoura } 1349 1.1 minoura sc->sc_omp = &sc->sc_omess[n]; 1350 1.1 minoura 1351 1.1 minoura nextbyte: 1352 1.1 minoura /* Send message bytes. */ 1353 1.1 minoura /* send TRANSFER command. */ 1354 1.1 minoura bus_space_write_1(iot, ioh, TCH, n >> 16); 1355 1.1 minoura bus_space_write_1(iot, ioh, TCM, n >> 8); 1356 1.1 minoura bus_space_write_1(iot, ioh, TCL, n); 1357 1.1 minoura bus_space_write_1(iot, ioh, PCTL, sc->sc_phase | PCTL_BFINT_ENAB); 1358 1.21 tsutsui #ifdef NEED_DREQ_ON_HARDWARE_XFER 1359 1.3 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_XFR); /* XXX */ 1360 1.3 minoura #else 1361 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 1362 1.20 tsutsui SCMD_XFR | SCMD_PROG_XFR); 1363 1.3 minoura #endif 1364 1.1 minoura for (;;) { 1365 1.1 minoura if ((bus_space_read_1(iot, ioh, SSTS) & SSTS_BUSY) != 0) 1366 1.1 minoura break; 1367 1.1 minoura if (bus_space_read_1(iot, ioh, INTS) != 0) 1368 1.1 minoura goto out; 1369 1.1 minoura } 1370 1.1 minoura for (;;) { 1371 1.1 minoura #if 0 1372 1.1 minoura for (;;) { 1373 1.1 minoura if ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0) 1374 1.1 minoura break; 1375 1.1 minoura /* Wait for REQINIT. XXX Need timeout. */ 1376 1.1 minoura } 1377 1.1 minoura #endif 1378 1.1 minoura if (bus_space_read_1(iot, ioh, INTS) != 0) { 1379 1.1 minoura /* 1380 1.1 minoura * Target left MESSAGE OUT, possibly to reject 1381 1.1 minoura * our message. 1382 1.1 minoura * 1383 1.1 minoura * If this is the last message being sent, then we 1384 1.1 minoura * deassert ATN, since either the target is going to 1385 1.1 minoura * ignore this message, or it's going to ask for a 1386 1.1 minoura * retransmission via MESSAGE PARITY ERROR (in which 1387 1.1 minoura * case we reassert ATN anyway). 1388 1.1 minoura */ 1389 1.1 minoura #if 0 1390 1.1 minoura if (sc->sc_msgpriq == 0) 1391 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ATN); 1392 1.1 minoura #endif 1393 1.1 minoura goto out; 1394 1.1 minoura } 1395 1.1 minoura 1396 1.1 minoura #if 0 1397 1.1 minoura /* Clear ATN before last byte if this is the last message. */ 1398 1.1 minoura if (n == 1 && sc->sc_msgpriq == 0) 1399 1.1 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ATN); 1400 1.1 minoura #endif 1401 1.1 minoura 1402 1.1 minoura while ((bus_space_read_1(iot, ioh, SSTS) & SSTS_DREG_FULL) != 0) 1403 1.36 tsutsui DELAY(1); 1404 1.1 minoura /* Send message byte. */ 1405 1.1 minoura bus_space_write_1(iot, ioh, DREG, *--sc->sc_omp); 1406 1.1 minoura --n; 1407 1.1 minoura /* Keep track of the last message we've sent any bytes of. */ 1408 1.1 minoura sc->sc_lastmsg = sc->sc_currmsg; 1409 1.1 minoura #if 0 1410 1.1 minoura /* Wait for ACK to be negated. XXX Need timeout. */ 1411 1.1 minoura while ((bus_space_read_1(iot, ioh, PSNS) & ACKI) != 0) 1412 1.1 minoura ; 1413 1.1 minoura #endif 1414 1.1 minoura 1415 1.1 minoura if (n == 0) 1416 1.1 minoura break; 1417 1.1 minoura } 1418 1.1 minoura 1419 1.1 minoura /* We get here only if the entire message has been transmitted. */ 1420 1.1 minoura if (sc->sc_msgpriq != 0) { 1421 1.1 minoura /* There are more outgoing messages. */ 1422 1.1 minoura goto nextmsg; 1423 1.1 minoura } 1424 1.1 minoura 1425 1.1 minoura /* 1426 1.1 minoura * The last message has been transmitted. We need to remember the last 1427 1.1 minoura * message transmitted (in case the target switches to MESSAGE IN phase 1428 1.1 minoura * and sends a MESSAGE REJECT), and the list of messages transmitted 1429 1.1 minoura * this time around (in case the target stays in MESSAGE OUT phase to 1430 1.1 minoura * request a retransmit). 1431 1.1 minoura */ 1432 1.1 minoura 1433 1.1 minoura out: 1434 1.1 minoura /* Disable REQ/ACK protocol. */ 1435 1.13 thorpej return; 1436 1.1 minoura } 1437 1.16 tsutsui 1438 1.1 minoura /* 1439 1.1 minoura * spc_dataout_pio: perform a data transfer using the FIFO datapath in the spc 1440 1.1 minoura * Precondition: The SCSI bus should be in the DOUT phase, with REQ asserted 1441 1.1 minoura * and ACK deasserted (i.e. waiting for a data byte) 1442 1.1 minoura * 1443 1.1 minoura * This new revision has been optimized (I tried) to make the common case fast, 1444 1.61 andvar * and the rarer cases (as a result) somewhat more complex 1445 1.1 minoura */ 1446 1.1 minoura int 1447 1.47 tsutsui spc_dataout_pio(struct spc_softc *sc, uint8_t *p, int n) 1448 1.1 minoura { 1449 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 1450 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 1451 1.47 tsutsui uint8_t intstat = 0; 1452 1.1 minoura int out = 0; 1453 1.1 minoura #define DOUTAMOUNT 8 /* Full FIFO */ 1454 1.1 minoura 1455 1.1 minoura SPC_TRACE(("spc_dataout_pio ")); 1456 1.1 minoura /* send TRANSFER command. */ 1457 1.1 minoura bus_space_write_1(iot, ioh, TCH, n >> 16); 1458 1.1 minoura bus_space_write_1(iot, ioh, TCM, n >> 8); 1459 1.1 minoura bus_space_write_1(iot, ioh, TCL, n); 1460 1.1 minoura bus_space_write_1(iot, ioh, PCTL, sc->sc_phase | PCTL_BFINT_ENAB); 1461 1.21 tsutsui #ifdef NEED_DREQ_ON_HARDWARE_XFER 1462 1.3 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_XFR); /* XXX */ 1463 1.3 minoura #else 1464 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 1465 1.20 tsutsui SCMD_XFR | SCMD_PROG_XFR); /* XXX */ 1466 1.3 minoura #endif 1467 1.1 minoura for (;;) { 1468 1.1 minoura if ((bus_space_read_1(iot, ioh, SSTS) & SSTS_BUSY) != 0) 1469 1.1 minoura break; 1470 1.1 minoura if (bus_space_read_1(iot, ioh, INTS) != 0) 1471 1.1 minoura break; 1472 1.1 minoura } 1473 1.1 minoura 1474 1.1 minoura /* 1475 1.1 minoura * I have tried to make the main loop as tight as possible. This 1476 1.1 minoura * means that some of the code following the loop is a bit more 1477 1.1 minoura * complex than otherwise. 1478 1.1 minoura */ 1479 1.1 minoura while (n > 0) { 1480 1.1 minoura int xfer; 1481 1.1 minoura 1482 1.1 minoura for (;;) { 1483 1.1 minoura intstat = bus_space_read_1(iot, ioh, INTS); 1484 1.2 minoura /* Wait till buffer is empty. */ 1485 1.15 tsutsui if ((bus_space_read_1(iot, ioh, SSTS) & 1486 1.15 tsutsui SSTS_DREG_EMPTY) != 0) 1487 1.1 minoura break; 1488 1.2 minoura /* Break on interrupt. */ 1489 1.1 minoura if (intstat != 0) 1490 1.1 minoura goto phasechange; 1491 1.36 tsutsui DELAY(1); 1492 1.1 minoura } 1493 1.1 minoura 1494 1.57 riastrad xfer = uimin(DOUTAMOUNT, n); 1495 1.1 minoura 1496 1.1 minoura SPC_MISC(("%d> ", xfer)); 1497 1.1 minoura 1498 1.1 minoura n -= xfer; 1499 1.1 minoura out += xfer; 1500 1.1 minoura 1501 1.18 tsutsui bus_space_write_multi_1(iot, ioh, DREG, p, xfer); 1502 1.18 tsutsui p += xfer; 1503 1.1 minoura } 1504 1.1 minoura 1505 1.1 minoura if (out == 0) { 1506 1.1 minoura for (;;) { 1507 1.1 minoura if (bus_space_read_1(iot, ioh, INTS) != 0) 1508 1.1 minoura break; 1509 1.36 tsutsui DELAY(1); 1510 1.1 minoura } 1511 1.1 minoura SPC_MISC(("extra data ")); 1512 1.1 minoura } else { 1513 1.1 minoura /* See the bytes off chip */ 1514 1.1 minoura for (;;) { 1515 1.2 minoura /* Wait till buffer is empty. */ 1516 1.15 tsutsui if ((bus_space_read_1(iot, ioh, SSTS) & 1517 1.15 tsutsui SSTS_DREG_EMPTY) != 0) 1518 1.1 minoura break; 1519 1.1 minoura intstat = bus_space_read_1(iot, ioh, INTS); 1520 1.2 minoura /* Break on interrupt. */ 1521 1.1 minoura if (intstat != 0) 1522 1.1 minoura goto phasechange; 1523 1.36 tsutsui DELAY(1); 1524 1.1 minoura } 1525 1.1 minoura } 1526 1.1 minoura 1527 1.1 minoura phasechange: 1528 1.1 minoura /* Stop the FIFO data path. */ 1529 1.1 minoura 1530 1.1 minoura if (intstat != 0) { 1531 1.1 minoura /* Some sort of phase change. */ 1532 1.1 minoura int amount; 1533 1.1 minoura 1534 1.15 tsutsui amount = (bus_space_read_1(iot, ioh, TCH) << 16) | 1535 1.15 tsutsui (bus_space_read_1(iot, ioh, TCM) << 8) | 1536 1.15 tsutsui bus_space_read_1(iot, ioh, TCL); 1537 1.1 minoura if (amount > 0) { 1538 1.1 minoura out -= amount; 1539 1.1 minoura SPC_MISC(("+%d ", amount)); 1540 1.1 minoura } 1541 1.1 minoura } 1542 1.1 minoura 1543 1.1 minoura return out; 1544 1.1 minoura } 1545 1.16 tsutsui 1546 1.1 minoura /* 1547 1.1 minoura * spc_datain_pio: perform data transfers using the FIFO datapath in the spc 1548 1.1 minoura * Precondition: The SCSI bus should be in the DIN phase, with REQ asserted 1549 1.1 minoura * and ACK deasserted (i.e. at least one byte is ready). 1550 1.1 minoura * 1551 1.1 minoura * For now, uses a pretty dumb algorithm, hangs around until all data has been 1552 1.1 minoura * transferred. This, is OK for fast targets, but not so smart for slow 1553 1.1 minoura * targets which don't disconnect or for huge transfers. 1554 1.1 minoura */ 1555 1.1 minoura int 1556 1.47 tsutsui spc_datain_pio(struct spc_softc *sc, uint8_t *p, int n) 1557 1.1 minoura { 1558 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 1559 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 1560 1.1 minoura int in = 0; 1561 1.38 tsutsui uint8_t intstat, sstat; 1562 1.1 minoura #define DINAMOUNT 8 /* Full FIFO */ 1563 1.1 minoura 1564 1.1 minoura SPC_TRACE(("spc_datain_pio ")); 1565 1.1 minoura /* send TRANSFER command. */ 1566 1.1 minoura bus_space_write_1(iot, ioh, TCH, n >> 16); 1567 1.1 minoura bus_space_write_1(iot, ioh, TCM, n >> 8); 1568 1.1 minoura bus_space_write_1(iot, ioh, TCL, n); 1569 1.1 minoura bus_space_write_1(iot, ioh, PCTL, sc->sc_phase | PCTL_BFINT_ENAB); 1570 1.21 tsutsui #ifdef NEED_DREQ_ON_HARDWARE_XFER 1571 1.3 minoura bus_space_write_1(iot, ioh, SCMD, SCMD_XFR); /* XXX */ 1572 1.3 minoura #else 1573 1.15 tsutsui bus_space_write_1(iot, ioh, SCMD, 1574 1.15 tsutsui SCMD_XFR | SCMD_PROG_XFR); /* XXX */ 1575 1.3 minoura #endif 1576 1.1 minoura 1577 1.3 minoura /* 1578 1.3 minoura * We leave this loop if one or more of the following is true: 1579 1.1 minoura * a) phase != PH_DATAIN && FIFOs are empty 1580 1.1 minoura * b) reset has occurred or busfree is detected. 1581 1.1 minoura */ 1582 1.32 mycroft intstat = 0; 1583 1.1 minoura while (n > 0) { 1584 1.30 mycroft sstat = bus_space_read_1(iot, ioh, SSTS); 1585 1.30 mycroft if ((sstat & SSTS_DREG_FULL) != 0) { 1586 1.30 mycroft n -= DINAMOUNT; 1587 1.30 mycroft in += DINAMOUNT; 1588 1.30 mycroft bus_space_read_multi_1(iot, ioh, DREG, p, DINAMOUNT); 1589 1.30 mycroft p += DINAMOUNT; 1590 1.30 mycroft } else if ((sstat & SSTS_DREG_EMPTY) == 0) { 1591 1.20 tsutsui n--; 1592 1.20 tsutsui in++; 1593 1.20 tsutsui *p++ = bus_space_read_1(iot, ioh, DREG); 1594 1.30 mycroft } else { 1595 1.30 mycroft if (intstat != 0) 1596 1.30 mycroft goto phasechange; 1597 1.32 mycroft intstat = bus_space_read_1(iot, ioh, INTS); 1598 1.20 tsutsui } 1599 1.1 minoura } 1600 1.1 minoura 1601 1.1 minoura /* 1602 1.1 minoura * Some SCSI-devices are rude enough to transfer more data than what 1603 1.1 minoura * was requested, e.g. 2048 bytes from a CD-ROM instead of the 1604 1.1 minoura * requested 512. Test for progress, i.e. real transfers. If no real 1605 1.1 minoura * transfers have been performed (n is probably already zero) and the 1606 1.1 minoura * FIFO is not empty, waste some bytes.... 1607 1.1 minoura */ 1608 1.1 minoura if (in == 0) { 1609 1.1 minoura for (;;) { 1610 1.31 mycroft sstat = bus_space_read_1(iot, ioh, SSTS); 1611 1.31 mycroft if ((sstat & SSTS_DREG_EMPTY) == 0) { 1612 1.31 mycroft (void) bus_space_read_1(iot, ioh, DREG); 1613 1.31 mycroft } else { 1614 1.31 mycroft if (intstat != 0) 1615 1.31 mycroft goto phasechange; 1616 1.32 mycroft intstat = bus_space_read_1(iot, ioh, INTS); 1617 1.31 mycroft } 1618 1.36 tsutsui DELAY(1); 1619 1.1 minoura } 1620 1.1 minoura SPC_MISC(("extra data ")); 1621 1.1 minoura } 1622 1.1 minoura 1623 1.1 minoura phasechange: 1624 1.1 minoura /* Stop the FIFO data path. */ 1625 1.1 minoura 1626 1.1 minoura return in; 1627 1.1 minoura } 1628 1.16 tsutsui 1629 1.1 minoura /* 1630 1.1 minoura * Catch an interrupt from the adaptor 1631 1.1 minoura */ 1632 1.1 minoura /* 1633 1.1 minoura * This is the workhorse routine of the driver. 1634 1.1 minoura * Deficiencies (for now): 1635 1.1 minoura * 1) always uses programmed I/O 1636 1.1 minoura */ 1637 1.1 minoura int 1638 1.37 tsutsui spc_intr(void *arg) 1639 1.1 minoura { 1640 1.3 minoura struct spc_softc *sc = arg; 1641 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 1642 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 1643 1.47 tsutsui uint8_t ints; 1644 1.3 minoura struct spc_acb *acb; 1645 1.6 bouyer struct scsipi_periph *periph; 1646 1.1 minoura struct spc_tinfo *ti; 1647 1.1 minoura int n; 1648 1.1 minoura 1649 1.34 tsutsui SPC_TRACE(("spc_intr ")); 1650 1.34 tsutsui 1651 1.34 tsutsui ints = bus_space_read_1(iot, ioh, INTS); 1652 1.34 tsutsui if (ints == 0) 1653 1.34 tsutsui return 0; 1654 1.34 tsutsui 1655 1.1 minoura /* 1656 1.2 minoura * Disable interrupt. 1657 1.1 minoura */ 1658 1.15 tsutsui bus_space_write_1(iot, ioh, SCTL, 1659 1.15 tsutsui bus_space_read_1(iot, ioh, SCTL) & ~SCTL_INTR_ENAB); 1660 1.1 minoura 1661 1.22 tsutsui if (sc->sc_dma_done != NULL && 1662 1.22 tsutsui sc->sc_state == SPC_CONNECTED && 1663 1.22 tsutsui (sc->sc_flags & SPC_DOINGDMA) != 0 && 1664 1.22 tsutsui (sc->sc_phase == PH_DATAOUT || sc->sc_phase == PH_DATAIN)) { 1665 1.22 tsutsui (*sc->sc_dma_done)(sc); 1666 1.22 tsutsui } 1667 1.22 tsutsui 1668 1.1 minoura loop: 1669 1.1 minoura /* 1670 1.2 minoura * Loop until transfer completion. 1671 1.1 minoura */ 1672 1.1 minoura /* 1673 1.1 minoura * First check for abnormal conditions, such as reset. 1674 1.1 minoura */ 1675 1.1 minoura ints = bus_space_read_1(iot, ioh, INTS); 1676 1.1 minoura SPC_MISC(("ints = 0x%x ", ints)); 1677 1.1 minoura 1678 1.1 minoura if ((ints & INTS_RST) != 0) { 1679 1.47 tsutsui printf("%s: SCSI bus reset\n", device_xname(sc->sc_dev)); 1680 1.1 minoura goto reset; 1681 1.1 minoura } 1682 1.1 minoura 1683 1.1 minoura /* 1684 1.1 minoura * Check for less serious errors. 1685 1.1 minoura */ 1686 1.15 tsutsui if ((bus_space_read_1(iot, ioh, SERR) & (SERR_SCSI_PAR|SERR_SPC_PAR)) 1687 1.15 tsutsui != 0) { 1688 1.47 tsutsui printf("%s: SCSI bus parity error\n", device_xname(sc->sc_dev)); 1689 1.1 minoura if (sc->sc_prevphase == PH_MSGIN) { 1690 1.1 minoura sc->sc_flags |= SPC_DROP_MSGIN; 1691 1.1 minoura spc_sched_msgout(sc, SEND_PARITY_ERROR); 1692 1.1 minoura } else 1693 1.1 minoura spc_sched_msgout(sc, SEND_INIT_DET_ERR); 1694 1.1 minoura } 1695 1.1 minoura 1696 1.1 minoura /* 1697 1.1 minoura * If we're not already busy doing something test for the following 1698 1.1 minoura * conditions: 1699 1.1 minoura * 1) We have been reselected by something 1700 1.1 minoura * 2) We have selected something successfully 1701 1.1 minoura * 3) Our selection process has timed out 1702 1.1 minoura * 4) This is really a bus free interrupt just to get a new command 1703 1.1 minoura * going? 1704 1.1 minoura * 5) Spurious interrupt? 1705 1.1 minoura */ 1706 1.1 minoura switch (sc->sc_state) { 1707 1.1 minoura case SPC_IDLE: 1708 1.1 minoura case SPC_SELECTING: 1709 1.1 minoura SPC_MISC(("ints:0x%02x ", ints)); 1710 1.1 minoura 1711 1.1 minoura if ((ints & INTS_SEL) != 0) { 1712 1.1 minoura /* 1713 1.1 minoura * We don't currently support target mode. 1714 1.1 minoura */ 1715 1.1 minoura printf("%s: target mode selected; going to BUS FREE\n", 1716 1.47 tsutsui device_xname(sc->sc_dev)); 1717 1.1 minoura 1718 1.1 minoura goto sched; 1719 1.1 minoura } else if ((ints & INTS_RESEL) != 0) { 1720 1.1 minoura SPC_MISC(("reselected ")); 1721 1.1 minoura 1722 1.1 minoura /* 1723 1.1 minoura * If we're trying to select a target ourselves, 1724 1.1 minoura * push our command back into the ready list. 1725 1.1 minoura */ 1726 1.1 minoura if (sc->sc_state == SPC_SELECTING) { 1727 1.1 minoura SPC_MISC(("backoff selector ")); 1728 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1729 1.1 minoura acb = sc->sc_nexus; 1730 1.1 minoura sc->sc_nexus = NULL; 1731 1.1 minoura TAILQ_INSERT_HEAD(&sc->ready_list, acb, chain); 1732 1.1 minoura } 1733 1.1 minoura 1734 1.1 minoura /* Save reselection ID. */ 1735 1.1 minoura sc->sc_selid = bus_space_read_1(iot, ioh, TEMP); 1736 1.1 minoura 1737 1.1 minoura sc->sc_state = SPC_RESELECTED; 1738 1.1 minoura } else if ((ints & INTS_CMD_DONE) != 0) { 1739 1.1 minoura SPC_MISC(("selected ")); 1740 1.1 minoura 1741 1.1 minoura /* 1742 1.1 minoura * We have selected a target. Things to do: 1743 1.1 minoura * a) Determine what message(s) to send. 1744 1.1 minoura * b) Verify that we're still selecting the target. 1745 1.1 minoura * c) Mark device as busy. 1746 1.1 minoura */ 1747 1.1 minoura if (sc->sc_state != SPC_SELECTING) { 1748 1.15 tsutsui printf("%s: selection out while idle; " 1749 1.47 tsutsui "resetting\n", device_xname(sc->sc_dev)); 1750 1.1 minoura SPC_BREAK(); 1751 1.1 minoura goto reset; 1752 1.1 minoura } 1753 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1754 1.1 minoura acb = sc->sc_nexus; 1755 1.6 bouyer periph = acb->xs->xs_periph; 1756 1.6 bouyer ti = &sc->sc_tinfo[periph->periph_target]; 1757 1.1 minoura 1758 1.1 minoura sc->sc_msgpriq = SEND_IDENTIFY; 1759 1.1 minoura if (acb->flags & ACB_RESET) 1760 1.1 minoura sc->sc_msgpriq |= SEND_DEV_RESET; 1761 1.1 minoura else if (acb->flags & ACB_ABORT) 1762 1.1 minoura sc->sc_msgpriq |= SEND_ABORT; 1763 1.1 minoura else { 1764 1.1 minoura #if SPC_USE_SYNCHRONOUS 1765 1.1 minoura if ((ti->flags & DO_SYNC) != 0) 1766 1.1 minoura sc->sc_msgpriq |= SEND_SDTR; 1767 1.1 minoura #endif 1768 1.1 minoura #if SPC_USE_WIDE 1769 1.1 minoura if ((ti->flags & DO_WIDE) != 0) 1770 1.1 minoura sc->sc_msgpriq |= SEND_WDTR; 1771 1.1 minoura #endif 1772 1.1 minoura } 1773 1.1 minoura 1774 1.1 minoura acb->flags |= ACB_NEXUS; 1775 1.6 bouyer ti->lubusy |= (1 << periph->periph_lun); 1776 1.1 minoura 1777 1.1 minoura /* Do an implicit RESTORE POINTERS. */ 1778 1.1 minoura sc->sc_dp = acb->data_addr; 1779 1.1 minoura sc->sc_dleft = acb->data_length; 1780 1.47 tsutsui sc->sc_cp = (uint8_t *)&acb->scsipi_cmd; 1781 1.1 minoura sc->sc_cleft = acb->scsipi_cmd_length; 1782 1.1 minoura 1783 1.1 minoura /* On our first connection, schedule a timeout. */ 1784 1.4 thorpej if ((acb->xs->xs_control & XS_CTL_POLL) == 0) 1785 1.5 thorpej callout_reset(&acb->xs->xs_callout, 1786 1.12 bouyer mstohz(acb->timeout), spc_timeout, acb); 1787 1.1 minoura 1788 1.1 minoura sc->sc_state = SPC_CONNECTED; 1789 1.1 minoura } else if ((ints & INTS_TIMEOUT) != 0) { 1790 1.1 minoura SPC_MISC(("selection timeout ")); 1791 1.1 minoura 1792 1.1 minoura if (sc->sc_state != SPC_SELECTING) { 1793 1.15 tsutsui printf("%s: selection timeout while idle; " 1794 1.47 tsutsui "resetting\n", device_xname(sc->sc_dev)); 1795 1.1 minoura SPC_BREAK(); 1796 1.1 minoura goto reset; 1797 1.1 minoura } 1798 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1799 1.1 minoura acb = sc->sc_nexus; 1800 1.1 minoura 1801 1.1 minoura delay(250); 1802 1.1 minoura 1803 1.1 minoura acb->xs->error = XS_SELTIMEOUT; 1804 1.1 minoura goto finish; 1805 1.1 minoura } else { 1806 1.1 minoura if (sc->sc_state != SPC_IDLE) { 1807 1.15 tsutsui printf("%s: BUS FREE while not idle; " 1808 1.15 tsutsui "state=%d\n", 1809 1.47 tsutsui device_xname(sc->sc_dev), sc->sc_state); 1810 1.1 minoura SPC_BREAK(); 1811 1.1 minoura goto out; 1812 1.1 minoura } 1813 1.1 minoura 1814 1.1 minoura goto sched; 1815 1.1 minoura } 1816 1.1 minoura 1817 1.1 minoura /* 1818 1.1 minoura * Turn off selection stuff, and prepare to catch bus free 1819 1.1 minoura * interrupts, parity errors, and phase changes. 1820 1.1 minoura */ 1821 1.1 minoura 1822 1.1 minoura sc->sc_flags = 0; 1823 1.1 minoura sc->sc_prevphase = PH_INVALID; 1824 1.1 minoura goto dophase; 1825 1.1 minoura } 1826 1.1 minoura 1827 1.1 minoura if ((ints & INTS_DISCON) != 0) { 1828 1.1 minoura /* We've gone to BUS FREE phase. */ 1829 1.15 tsutsui /* disable disconnect interrupt */ 1830 1.1 minoura bus_space_write_1(iot, ioh, PCTL, 1831 1.1 minoura bus_space_read_1(iot, ioh, PCTL) & ~PCTL_BFINT_ENAB); 1832 1.62 andvar /* XXX reset interrupt */ 1833 1.1 minoura bus_space_write_1(iot, ioh, INTS, ints); 1834 1.1 minoura 1835 1.1 minoura switch (sc->sc_state) { 1836 1.1 minoura case SPC_RESELECTED: 1837 1.1 minoura goto sched; 1838 1.1 minoura 1839 1.1 minoura case SPC_CONNECTED: 1840 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1841 1.1 minoura acb = sc->sc_nexus; 1842 1.1 minoura 1843 1.1 minoura #if SPC_USE_SYNCHRONOUS + SPC_USE_WIDE 1844 1.1 minoura if (sc->sc_prevphase == PH_MSGOUT) { 1845 1.1 minoura /* 1846 1.1 minoura * If the target went to BUS FREE phase during 1847 1.1 minoura * or immediately after sending a SDTR or WDTR 1848 1.1 minoura * message, disable negotiation. 1849 1.1 minoura */ 1850 1.6 bouyer periph = acb->xs->xs_periph; 1851 1.6 bouyer ti = &sc->sc_tinfo[periph->periph_target]; 1852 1.1 minoura switch (sc->sc_lastmsg) { 1853 1.1 minoura #if SPC_USE_SYNCHRONOUS 1854 1.1 minoura case SEND_SDTR: 1855 1.1 minoura ti->flags &= ~DO_SYNC; 1856 1.1 minoura ti->period = ti->offset = 0; 1857 1.1 minoura break; 1858 1.1 minoura #endif 1859 1.1 minoura #if SPC_USE_WIDE 1860 1.1 minoura case SEND_WDTR: 1861 1.1 minoura ti->flags &= ~DO_WIDE; 1862 1.1 minoura ti->width = 0; 1863 1.1 minoura break; 1864 1.1 minoura #endif 1865 1.1 minoura } 1866 1.1 minoura } 1867 1.1 minoura #endif 1868 1.1 minoura 1869 1.1 minoura if ((sc->sc_flags & SPC_ABORTING) == 0) { 1870 1.1 minoura /* 1871 1.1 minoura * Section 5.1.1 of the SCSI 2 spec suggests 1872 1.1 minoura * issuing a REQUEST SENSE following an 1873 1.1 minoura * unexpected disconnect. Some devices go into 1874 1.1 minoura * a contingent allegiance condition when 1875 1.1 minoura * disconnecting, and this is necessary to 1876 1.1 minoura * clean up their state. 1877 1.1 minoura */ 1878 1.15 tsutsui printf("%s: unexpected disconnect; " 1879 1.15 tsutsui "sending REQUEST SENSE\n", 1880 1.47 tsutsui device_xname(sc->sc_dev)); 1881 1.1 minoura SPC_BREAK(); 1882 1.6 bouyer acb->target_stat = SCSI_CHECK; 1883 1.6 bouyer acb->xs->error = XS_NOERROR; 1884 1.6 bouyer goto finish; 1885 1.1 minoura } 1886 1.1 minoura 1887 1.1 minoura acb->xs->error = XS_DRIVER_STUFFUP; 1888 1.1 minoura goto finish; 1889 1.1 minoura 1890 1.1 minoura case SPC_DISCONNECT: 1891 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1892 1.1 minoura acb = sc->sc_nexus; 1893 1.1 minoura TAILQ_INSERT_HEAD(&sc->nexus_list, acb, chain); 1894 1.1 minoura sc->sc_nexus = NULL; 1895 1.1 minoura goto sched; 1896 1.1 minoura 1897 1.1 minoura case SPC_CMDCOMPLETE: 1898 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1899 1.1 minoura acb = sc->sc_nexus; 1900 1.1 minoura goto finish; 1901 1.1 minoura } 1902 1.1 minoura } 1903 1.1 minoura else if ((ints & INTS_CMD_DONE) != 0 && 1904 1.15 tsutsui sc->sc_prevphase == PH_MSGIN && 1905 1.15 tsutsui sc->sc_state != SPC_CONNECTED) 1906 1.1 minoura goto out; 1907 1.1 minoura 1908 1.1 minoura dophase: 1909 1.1 minoura #if 0 1910 1.1 minoura if ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0) { 1911 1.1 minoura /* Wait for REQINIT. */ 1912 1.1 minoura goto out; 1913 1.1 minoura } 1914 1.1 minoura #else 1915 1.1 minoura bus_space_write_1(iot, ioh, INTS, ints); 1916 1.1 minoura ints = 0; 1917 1.1 minoura while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0) 1918 1.1 minoura delay(1); /* need timeout XXX */ 1919 1.1 minoura #endif 1920 1.1 minoura 1921 1.1 minoura /* 1922 1.2 minoura * State transition. 1923 1.1 minoura */ 1924 1.1 minoura sc->sc_phase = bus_space_read_1(iot, ioh, PSNS) & PH_MASK; 1925 1.15 tsutsui #if 0 1926 1.15 tsutsui bus_space_write_1(iot, ioh, PCTL, sc->sc_phase); 1927 1.15 tsutsui #endif 1928 1.1 minoura 1929 1.3 minoura SPC_MISC(("phase=%d\n", sc->sc_phase)); 1930 1.1 minoura switch (sc->sc_phase) { 1931 1.1 minoura case PH_MSGOUT: 1932 1.1 minoura if (sc->sc_state != SPC_CONNECTED && 1933 1.1 minoura sc->sc_state != SPC_RESELECTED) 1934 1.1 minoura break; 1935 1.1 minoura spc_msgout(sc); 1936 1.1 minoura sc->sc_prevphase = PH_MSGOUT; 1937 1.1 minoura goto loop; 1938 1.1 minoura 1939 1.1 minoura case PH_MSGIN: 1940 1.1 minoura if (sc->sc_state != SPC_CONNECTED && 1941 1.1 minoura sc->sc_state != SPC_RESELECTED) 1942 1.1 minoura break; 1943 1.1 minoura spc_msgin(sc); 1944 1.1 minoura sc->sc_prevphase = PH_MSGIN; 1945 1.1 minoura goto loop; 1946 1.1 minoura 1947 1.1 minoura case PH_CMD: 1948 1.1 minoura if (sc->sc_state != SPC_CONNECTED) 1949 1.1 minoura break; 1950 1.1 minoura #if SPC_DEBUG 1951 1.1 minoura if ((spc_debug & SPC_SHOWMISC) != 0) { 1952 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 1953 1.1 minoura acb = sc->sc_nexus; 1954 1.1 minoura printf("cmd=0x%02x+%d ", 1955 1.15 tsutsui acb->scsipi_cmd.opcode, acb->scsipi_cmd_length - 1); 1956 1.1 minoura } 1957 1.1 minoura #endif 1958 1.1 minoura n = spc_dataout_pio(sc, sc->sc_cp, sc->sc_cleft); 1959 1.1 minoura sc->sc_cp += n; 1960 1.1 minoura sc->sc_cleft -= n; 1961 1.1 minoura sc->sc_prevphase = PH_CMD; 1962 1.1 minoura goto loop; 1963 1.1 minoura 1964 1.1 minoura case PH_DATAOUT: 1965 1.1 minoura if (sc->sc_state != SPC_CONNECTED) 1966 1.1 minoura break; 1967 1.52 jakllsch SPC_MISC(("dataout dleft=%zu ", sc->sc_dleft)); 1968 1.22 tsutsui if (sc->sc_dma_start != NULL && 1969 1.22 tsutsui sc->sc_dleft > SPC_MIN_DMA_LEN) { 1970 1.22 tsutsui (*sc->sc_dma_start)(sc, sc->sc_dp, sc->sc_dleft, 0); 1971 1.22 tsutsui sc->sc_prevphase = PH_DATAOUT; 1972 1.22 tsutsui goto out; 1973 1.22 tsutsui } 1974 1.1 minoura n = spc_dataout_pio(sc, sc->sc_dp, sc->sc_dleft); 1975 1.1 minoura sc->sc_dp += n; 1976 1.1 minoura sc->sc_dleft -= n; 1977 1.1 minoura sc->sc_prevphase = PH_DATAOUT; 1978 1.1 minoura goto loop; 1979 1.1 minoura 1980 1.1 minoura case PH_DATAIN: 1981 1.1 minoura if (sc->sc_state != SPC_CONNECTED) 1982 1.1 minoura break; 1983 1.1 minoura SPC_MISC(("datain ")); 1984 1.22 tsutsui if (sc->sc_dma_start != NULL && 1985 1.22 tsutsui sc->sc_dleft > SPC_MIN_DMA_LEN) { 1986 1.22 tsutsui (*sc->sc_dma_start)(sc, sc->sc_dp, sc->sc_dleft, 1); 1987 1.22 tsutsui sc->sc_prevphase = PH_DATAIN; 1988 1.22 tsutsui goto out; 1989 1.22 tsutsui } 1990 1.1 minoura n = spc_datain_pio(sc, sc->sc_dp, sc->sc_dleft); 1991 1.1 minoura sc->sc_dp += n; 1992 1.1 minoura sc->sc_dleft -= n; 1993 1.1 minoura sc->sc_prevphase = PH_DATAIN; 1994 1.1 minoura goto loop; 1995 1.1 minoura 1996 1.1 minoura case PH_STAT: 1997 1.1 minoura if (sc->sc_state != SPC_CONNECTED) 1998 1.1 minoura break; 1999 1.1 minoura SPC_ASSERT(sc->sc_nexus != NULL); 2000 1.1 minoura acb = sc->sc_nexus; 2001 1.20 tsutsui 2002 1.20 tsutsui if ((bus_space_read_1(iot, ioh, PSNS) & PSNS_ATN) != 0) 2003 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ATN); 2004 1.35 tsutsui bus_space_write_1(iot, ioh, PCTL, PCTL_BFINT_ENAB | PH_STAT); 2005 1.20 tsutsui while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0) 2006 1.36 tsutsui DELAY(1); /* XXX needs timeout */ 2007 1.27 tsutsui acb->target_stat = bus_space_read_1(iot, ioh, TEMP); 2008 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ACK); 2009 1.20 tsutsui while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0) 2010 1.36 tsutsui DELAY(1); /* XXX needs timeout */ 2011 1.20 tsutsui bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK); 2012 1.20 tsutsui 2013 1.1 minoura SPC_MISC(("target_stat=0x%02x ", acb->target_stat)); 2014 1.1 minoura sc->sc_prevphase = PH_STAT; 2015 1.1 minoura goto loop; 2016 1.1 minoura } 2017 1.1 minoura 2018 1.47 tsutsui printf("%s: unexpected bus phase; resetting\n", 2019 1.47 tsutsui device_xname(sc->sc_dev)); 2020 1.1 minoura SPC_BREAK(); 2021 1.1 minoura reset: 2022 1.29 mycroft spc_init(sc, 1); 2023 1.1 minoura return 1; 2024 1.1 minoura 2025 1.1 minoura finish: 2026 1.5 thorpej callout_stop(&acb->xs->xs_callout); 2027 1.1 minoura bus_space_write_1(iot, ioh, INTS, ints); 2028 1.1 minoura ints = 0; 2029 1.1 minoura spc_done(sc, acb); 2030 1.1 minoura goto out; 2031 1.1 minoura 2032 1.1 minoura sched: 2033 1.1 minoura sc->sc_state = SPC_IDLE; 2034 1.1 minoura spc_sched(sc); 2035 1.1 minoura goto out; 2036 1.1 minoura 2037 1.1 minoura out: 2038 1.1 minoura if (ints) 2039 1.1 minoura bus_space_write_1(iot, ioh, INTS, ints); 2040 1.1 minoura bus_space_write_1(iot, ioh, SCTL, 2041 1.1 minoura bus_space_read_1(iot, ioh, SCTL) | SCTL_INTR_ENAB); 2042 1.1 minoura return 1; 2043 1.1 minoura } 2044 1.1 minoura 2045 1.1 minoura void 2046 1.37 tsutsui spc_abort(struct spc_softc *sc, struct spc_acb *acb) 2047 1.1 minoura { 2048 1.1 minoura 2049 1.1 minoura /* 2 secs for the abort */ 2050 1.1 minoura acb->timeout = SPC_ABORT_TIMEOUT; 2051 1.1 minoura acb->flags |= ACB_ABORT; 2052 1.1 minoura 2053 1.1 minoura if (acb == sc->sc_nexus) { 2054 1.1 minoura /* 2055 1.1 minoura * If we're still selecting, the message will be scheduled 2056 1.1 minoura * after selection is complete. 2057 1.1 minoura */ 2058 1.1 minoura if (sc->sc_state == SPC_CONNECTED) 2059 1.1 minoura spc_sched_msgout(sc, SEND_ABORT); 2060 1.1 minoura } else { 2061 1.1 minoura spc_dequeue(sc, acb); 2062 1.1 minoura TAILQ_INSERT_HEAD(&sc->ready_list, acb, chain); 2063 1.1 minoura if (sc->sc_state == SPC_IDLE) 2064 1.1 minoura spc_sched(sc); 2065 1.1 minoura } 2066 1.1 minoura } 2067 1.1 minoura 2068 1.1 minoura void 2069 1.37 tsutsui spc_timeout(void *arg) 2070 1.1 minoura { 2071 1.1 minoura struct spc_acb *acb = arg; 2072 1.1 minoura struct scsipi_xfer *xs = acb->xs; 2073 1.6 bouyer struct scsipi_periph *periph = xs->xs_periph; 2074 1.15 tsutsui struct spc_softc *sc; 2075 1.1 minoura int s; 2076 1.1 minoura 2077 1.47 tsutsui sc = device_private(periph->periph_channel->chan_adapter->adapt_dev); 2078 1.6 bouyer scsipi_printaddr(periph); 2079 1.1 minoura printf("timed out"); 2080 1.1 minoura 2081 1.1 minoura s = splbio(); 2082 1.1 minoura 2083 1.1 minoura if (acb->flags & ACB_ABORT) { 2084 1.1 minoura /* abort timed out */ 2085 1.1 minoura printf(" AGAIN\n"); 2086 1.1 minoura /* XXX Must reset! */ 2087 1.1 minoura } else { 2088 1.1 minoura /* abort the operation that has timed out */ 2089 1.1 minoura printf("\n"); 2090 1.1 minoura acb->xs->error = XS_TIMEOUT; 2091 1.1 minoura spc_abort(sc, acb); 2092 1.1 minoura } 2093 1.1 minoura 2094 1.1 minoura splx(s); 2095 1.1 minoura } 2096 1.16 tsutsui 2097 1.3 minoura #ifdef SPC_DEBUG 2098 1.1 minoura /* 2099 1.1 minoura * The following functions are mostly used for debugging purposes, either 2100 1.1 minoura * directly called from the driver or from the kernel debugger. 2101 1.1 minoura */ 2102 1.1 minoura 2103 1.1 minoura void 2104 1.37 tsutsui spc_show_scsi_cmd(struct spc_acb *acb) 2105 1.1 minoura { 2106 1.47 tsutsui uint8_t *b = (uint8_t *)&acb->scsipi_cmd; 2107 1.1 minoura int i; 2108 1.1 minoura 2109 1.6 bouyer scsipi_printaddr(acb->xs->xs_periph); 2110 1.4 thorpej if ((acb->xs->xs_control & XS_CTL_RESET) == 0) { 2111 1.1 minoura for (i = 0; i < acb->scsipi_cmd_length; i++) { 2112 1.1 minoura if (i) 2113 1.1 minoura printf(","); 2114 1.1 minoura printf("%x", b[i]); 2115 1.1 minoura } 2116 1.1 minoura printf("\n"); 2117 1.1 minoura } else 2118 1.1 minoura printf("RESET\n"); 2119 1.1 minoura } 2120 1.1 minoura 2121 1.1 minoura void 2122 1.37 tsutsui spc_print_acb(struct spc_acb *acb) 2123 1.1 minoura { 2124 1.1 minoura 2125 1.1 minoura printf("acb@%p xs=%p flags=%x", acb, acb->xs, acb->flags); 2126 1.1 minoura printf(" dp=%p dleft=%d target_stat=%x\n", 2127 1.15 tsutsui acb->data_addr, acb->data_length, acb->target_stat); 2128 1.1 minoura spc_show_scsi_cmd(acb); 2129 1.1 minoura } 2130 1.1 minoura 2131 1.1 minoura void 2132 1.37 tsutsui spc_print_active_acb(void) 2133 1.1 minoura { 2134 1.1 minoura struct spc_acb *acb; 2135 1.49 cegger struct spc_softc *sc = device_lookup_private(&spc_cd, 0); /* XXX */ 2136 1.1 minoura 2137 1.1 minoura printf("ready list:\n"); 2138 1.15 tsutsui TAILQ_FOREACH(acb, &sc->ready_list, chain) 2139 1.1 minoura spc_print_acb(acb); 2140 1.1 minoura printf("nexus:\n"); 2141 1.1 minoura if (sc->sc_nexus != NULL) 2142 1.1 minoura spc_print_acb(sc->sc_nexus); 2143 1.1 minoura printf("nexus list:\n"); 2144 1.15 tsutsui TAILQ_FOREACH(acb, &sc->nexus_list, chain) 2145 1.1 minoura spc_print_acb(acb); 2146 1.1 minoura } 2147 1.1 minoura 2148 1.1 minoura void 2149 1.37 tsutsui spc_dump89352(struct spc_softc *sc) 2150 1.1 minoura { 2151 1.1 minoura bus_space_tag_t iot = sc->sc_iot; 2152 1.1 minoura bus_space_handle_t ioh = sc->sc_ioh; 2153 1.1 minoura 2154 1.1 minoura printf("mb89352: BDID=%x SCTL=%x SCMD=%x TMOD=%x\n", 2155 1.1 minoura bus_space_read_1(iot, ioh, BDID), 2156 1.1 minoura bus_space_read_1(iot, ioh, SCTL), 2157 1.1 minoura bus_space_read_1(iot, ioh, SCMD), 2158 1.1 minoura bus_space_read_1(iot, ioh, TMOD)); 2159 1.1 minoura printf(" INTS=%x PSNS=%x SSTS=%x SERR=%x PCTL=%x\n", 2160 1.1 minoura bus_space_read_1(iot, ioh, INTS), 2161 1.1 minoura bus_space_read_1(iot, ioh, PSNS), 2162 1.1 minoura bus_space_read_1(iot, ioh, SSTS), 2163 1.1 minoura bus_space_read_1(iot, ioh, SERR), 2164 1.1 minoura bus_space_read_1(iot, ioh, PCTL)); 2165 1.1 minoura printf(" MBC=%x DREG=%x TEMP=%x TCH=%x TCM=%x\n", 2166 1.1 minoura bus_space_read_1(iot, ioh, MBC), 2167 1.3 minoura #if 0 2168 1.1 minoura bus_space_read_1(iot, ioh, DREG), 2169 1.3 minoura #else 2170 1.3 minoura 0, 2171 1.3 minoura #endif 2172 1.1 minoura bus_space_read_1(iot, ioh, TEMP), 2173 1.1 minoura bus_space_read_1(iot, ioh, TCH), 2174 1.1 minoura bus_space_read_1(iot, ioh, TCM)); 2175 1.1 minoura printf(" TCL=%x EXBF=%x\n", 2176 1.1 minoura bus_space_read_1(iot, ioh, TCL), 2177 1.1 minoura bus_space_read_1(iot, ioh, EXBF)); 2178 1.1 minoura } 2179 1.1 minoura 2180 1.1 minoura void 2181 1.37 tsutsui spc_dump_driver(struct spc_softc *sc) 2182 1.1 minoura { 2183 1.1 minoura struct spc_tinfo *ti; 2184 1.1 minoura int i; 2185 1.1 minoura 2186 1.1 minoura printf("nexus=%p prevphase=%x\n", sc->sc_nexus, sc->sc_prevphase); 2187 1.15 tsutsui printf("state=%x msgin=%x msgpriq=%x msgoutq=%x lastmsg=%x " 2188 1.15 tsutsui "currmsg=%x\n", sc->sc_state, sc->sc_imess[0], 2189 1.1 minoura sc->sc_msgpriq, sc->sc_msgoutq, sc->sc_lastmsg, sc->sc_currmsg); 2190 1.1 minoura for (i = 0; i < 7; i++) { 2191 1.1 minoura ti = &sc->sc_tinfo[i]; 2192 1.1 minoura printf("tinfo%d: %d cmds %d disconnects %d timeouts", 2193 1.1 minoura i, ti->cmds, ti->dconns, ti->touts); 2194 1.1 minoura printf(" %d senses flags=%x\n", ti->senses, ti->flags); 2195 1.1 minoura } 2196 1.1 minoura } 2197 1.1 minoura #endif 2198