1 1.59 thorpej /* $NetBSD: adw.c,v 1.59 2021/08/07 16:19:11 thorpej Exp $ */ 2 1.1 dante 3 1.1 dante /* 4 1.1 dante * Generic driver for the Advanced Systems Inc. SCSI controllers 5 1.1 dante * 6 1.13 dante * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc. 7 1.1 dante * All rights reserved. 8 1.1 dante * 9 1.1 dante * Author: Baldassare Dante Profeta <dante (at) mclink.it> 10 1.1 dante * 11 1.1 dante * Redistribution and use in source and binary forms, with or without 12 1.1 dante * modification, are permitted provided that the following conditions 13 1.1 dante * are met: 14 1.1 dante * 1. Redistributions of source code must retain the above copyright 15 1.1 dante * notice, this list of conditions and the following disclaimer. 16 1.1 dante * 2. Redistributions in binary form must reproduce the above copyright 17 1.1 dante * notice, this list of conditions and the following disclaimer in the 18 1.1 dante * documentation and/or other materials provided with the distribution. 19 1.1 dante * 20 1.1 dante * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 1.1 dante * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 1.1 dante * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 1.1 dante * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 1.1 dante * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 1.1 dante * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 1.1 dante * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 1.1 dante * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 1.1 dante * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 1.1 dante * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 1.1 dante * POSSIBILITY OF SUCH DAMAGE. 31 1.1 dante */ 32 1.36 lukem 33 1.36 lukem #include <sys/cdefs.h> 34 1.59 thorpej __KERNEL_RCSID(0, "$NetBSD: adw.c,v 1.59 2021/08/07 16:19:11 thorpej Exp $"); 35 1.1 dante 36 1.1 dante #include <sys/param.h> 37 1.1 dante #include <sys/systm.h> 38 1.15 thorpej #include <sys/callout.h> 39 1.1 dante #include <sys/kernel.h> 40 1.1 dante #include <sys/errno.h> 41 1.1 dante #include <sys/ioctl.h> 42 1.1 dante #include <sys/device.h> 43 1.1 dante #include <sys/malloc.h> 44 1.1 dante #include <sys/buf.h> 45 1.1 dante #include <sys/proc.h> 46 1.1 dante 47 1.48 ad #include <sys/bus.h> 48 1.48 ad #include <sys/intr.h> 49 1.1 dante 50 1.1 dante #include <dev/scsipi/scsi_all.h> 51 1.1 dante #include <dev/scsipi/scsipi_all.h> 52 1.1 dante #include <dev/scsipi/scsiconf.h> 53 1.1 dante 54 1.1 dante #include <dev/ic/adwlib.h> 55 1.22 dante #include <dev/ic/adwmcode.h> 56 1.1 dante #include <dev/ic/adw.h> 57 1.1 dante 58 1.1 dante #ifndef DDB 59 1.11 dante #define Debugger() panic("should call debugger here (adw.c)") 60 1.2 dante #endif /* ! DDB */ 61 1.1 dante 62 1.1 dante /******************************************************************************/ 63 1.1 dante 64 1.1 dante 65 1.30 lukem static int adw_alloc_controls(ADW_SOFTC *); 66 1.30 lukem static int adw_alloc_carriers(ADW_SOFTC *); 67 1.30 lukem static int adw_create_ccbs(ADW_SOFTC *, ADW_CCB *, int); 68 1.30 lukem static void adw_free_ccb(ADW_SOFTC *, ADW_CCB *); 69 1.30 lukem static void adw_reset_ccb(ADW_CCB *); 70 1.30 lukem static int adw_init_ccb(ADW_SOFTC *, ADW_CCB *); 71 1.30 lukem static ADW_CCB *adw_get_ccb(ADW_SOFTC *); 72 1.30 lukem static int adw_queue_ccb(ADW_SOFTC *, ADW_CCB *); 73 1.30 lukem 74 1.30 lukem static void adw_scsipi_request(struct scsipi_channel *, 75 1.30 lukem scsipi_adapter_req_t, void *); 76 1.30 lukem static int adw_build_req(ADW_SOFTC *, ADW_CCB *); 77 1.30 lukem static void adw_build_sglist(ADW_CCB *, ADW_SCSI_REQ_Q *, ADW_SG_BLOCK *); 78 1.30 lukem static void adwminphys(struct buf *); 79 1.30 lukem static void adw_isr_callback(ADW_SOFTC *, ADW_SCSI_REQ_Q *); 80 1.30 lukem static void adw_async_callback(ADW_SOFTC *, u_int8_t); 81 1.30 lukem 82 1.30 lukem static void adw_print_info(ADW_SOFTC *, int); 83 1.30 lukem 84 1.30 lukem static int adw_poll(ADW_SOFTC *, struct scsipi_xfer *, int); 85 1.30 lukem static void adw_timeout(void *); 86 1.30 lukem static void adw_reset_bus(ADW_SOFTC *); 87 1.1 dante 88 1.1 dante 89 1.1 dante /******************************************************************************/ 90 1.22 dante /* DMA Mapping for Control Blocks */ 91 1.1 dante /******************************************************************************/ 92 1.1 dante 93 1.1 dante 94 1.1 dante static int 95 1.30 lukem adw_alloc_controls(ADW_SOFTC *sc) 96 1.1 dante { 97 1.1 dante bus_dma_segment_t seg; 98 1.1 dante int error, rseg; 99 1.1 dante 100 1.1 dante /* 101 1.13 dante * Allocate the control structure. 102 1.1 dante */ 103 1.1 dante if ((error = bus_dmamem_alloc(sc->sc_dmat, sizeof(struct adw_control), 104 1.54 msaitoh PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { 105 1.54 msaitoh aprint_error_dev(sc->sc_dev, "unable to allocate control " 106 1.54 msaitoh "structures, error = %d\n", error); 107 1.1 dante return (error); 108 1.1 dante } 109 1.1 dante if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 110 1.54 msaitoh sizeof(struct adw_control), (void **) & sc->sc_control, 111 1.54 msaitoh BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { 112 1.54 msaitoh aprint_error_dev(sc->sc_dev, 113 1.54 msaitoh "unable to map control structures, error = %d\n", error); 114 1.1 dante return (error); 115 1.1 dante } 116 1.13 dante 117 1.1 dante /* 118 1.1 dante * Create and load the DMA map used for the control blocks. 119 1.1 dante */ 120 1.1 dante if ((error = bus_dmamap_create(sc->sc_dmat, sizeof(struct adw_control), 121 1.54 msaitoh 1, sizeof(struct adw_control), 0, BUS_DMA_NOWAIT, 122 1.54 msaitoh &sc->sc_dmamap_control)) != 0) { 123 1.54 msaitoh aprint_error_dev(sc->sc_dev, 124 1.54 msaitoh "unable to create control DMA map, error = %d\n", error); 125 1.1 dante return (error); 126 1.1 dante } 127 1.1 dante if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap_control, 128 1.54 msaitoh sc->sc_control, sizeof(struct adw_control), NULL, 129 1.54 msaitoh BUS_DMA_NOWAIT)) != 0) { 130 1.54 msaitoh aprint_error_dev(sc->sc_dev, 131 1.54 msaitoh "unable to load control DMA map, error = %d\n", error); 132 1.1 dante return (error); 133 1.1 dante } 134 1.13 dante 135 1.13 dante return (0); 136 1.13 dante } 137 1.13 dante 138 1.13 dante 139 1.13 dante static int 140 1.30 lukem adw_alloc_carriers(ADW_SOFTC *sc) 141 1.13 dante { 142 1.13 dante bus_dma_segment_t seg; 143 1.13 dante int error, rseg; 144 1.13 dante 145 1.13 dante /* 146 1.13 dante * Allocate the control structure. 147 1.13 dante */ 148 1.19 dante sc->sc_control->carriers = malloc(sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 149 1.13 dante M_DEVBUF, M_WAITOK); 150 1.13 dante if(!sc->sc_control->carriers) { 151 1.52 chs aprint_error_dev(sc->sc_dev, 152 1.49 cegger "malloc() failed in allocating carrier structures\n"); 153 1.18 thorpej return (ENOMEM); 154 1.13 dante } 155 1.13 dante 156 1.13 dante if ((error = bus_dmamem_alloc(sc->sc_dmat, 157 1.54 msaitoh sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 158 1.54 msaitoh 0x10, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { 159 1.54 msaitoh aprint_error_dev(sc->sc_dev, "unable to allocate carrier " 160 1.54 msaitoh "structures, error = %d\n", error); 161 1.13 dante return (error); 162 1.13 dante } 163 1.13 dante if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 164 1.54 msaitoh sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 165 1.54 msaitoh (void **)&sc->sc_control->carriers, 166 1.54 msaitoh BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) { 167 1.54 msaitoh aprint_error_dev(sc->sc_dev, 168 1.54 msaitoh "unable to map carrier structures, error = %d\n", error); 169 1.13 dante return (error); 170 1.13 dante } 171 1.13 dante 172 1.13 dante /* 173 1.13 dante * Create and load the DMA map used for the control blocks. 174 1.13 dante */ 175 1.13 dante if ((error = bus_dmamap_create(sc->sc_dmat, 176 1.54 msaitoh sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 1, 177 1.54 msaitoh sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 0,BUS_DMA_NOWAIT, 178 1.54 msaitoh &sc->sc_dmamap_carrier)) != 0) { 179 1.54 msaitoh aprint_error_dev(sc->sc_dev, 180 1.54 msaitoh "unable to create carriers DMA map, error = %d\n", error); 181 1.13 dante return (error); 182 1.13 dante } 183 1.54 msaitoh if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap_carrier, 184 1.54 msaitoh sc->sc_control->carriers, sizeof(ADW_CARRIER) * ADW_MAX_CARRIER, 185 1.54 msaitoh NULL, BUS_DMA_NOWAIT)) != 0) { 186 1.54 msaitoh aprint_error_dev(sc->sc_dev, 187 1.54 msaitoh "unable to load carriers DMA map, error = %d\n", error); 188 1.13 dante return (error); 189 1.13 dante } 190 1.13 dante 191 1.1 dante return (0); 192 1.1 dante } 193 1.1 dante 194 1.1 dante 195 1.22 dante /******************************************************************************/ 196 1.22 dante /* Control Blocks routines */ 197 1.22 dante /******************************************************************************/ 198 1.13 dante 199 1.13 dante 200 1.13 dante /* 201 1.1 dante * Create a set of ccbs and add them to the free list. Called once 202 1.1 dante * by adw_init(). We return the number of CCBs successfully created. 203 1.1 dante */ 204 1.1 dante static int 205 1.30 lukem adw_create_ccbs(ADW_SOFTC *sc, ADW_CCB *ccbstore, int count) 206 1.1 dante { 207 1.1 dante ADW_CCB *ccb; 208 1.1 dante int i, error; 209 1.1 dante 210 1.1 dante for (i = 0; i < count; i++) { 211 1.1 dante ccb = &ccbstore[i]; 212 1.1 dante if ((error = adw_init_ccb(sc, ccb)) != 0) { 213 1.54 msaitoh aprint_error_dev(sc->sc_dev, 214 1.54 msaitoh "unable to initialize ccb, error = %d\n", error); 215 1.1 dante return (i); 216 1.1 dante } 217 1.1 dante TAILQ_INSERT_TAIL(&sc->sc_free_ccb, ccb, chain); 218 1.1 dante } 219 1.1 dante 220 1.1 dante return (i); 221 1.1 dante } 222 1.1 dante 223 1.1 dante 224 1.1 dante /* 225 1.1 dante * A ccb is put onto the free list. 226 1.1 dante */ 227 1.1 dante static void 228 1.30 lukem adw_free_ccb(ADW_SOFTC *sc, ADW_CCB *ccb) 229 1.1 dante { 230 1.1 dante int s; 231 1.1 dante 232 1.1 dante s = splbio(); 233 1.1 dante 234 1.1 dante adw_reset_ccb(ccb); 235 1.1 dante TAILQ_INSERT_HEAD(&sc->sc_free_ccb, ccb, chain); 236 1.1 dante 237 1.1 dante splx(s); 238 1.1 dante } 239 1.1 dante 240 1.1 dante 241 1.1 dante static void 242 1.30 lukem adw_reset_ccb(ADW_CCB *ccb) 243 1.1 dante { 244 1.1 dante 245 1.1 dante ccb->flags = 0; 246 1.1 dante } 247 1.1 dante 248 1.1 dante 249 1.1 dante static int 250 1.30 lukem adw_init_ccb(ADW_SOFTC *sc, ADW_CCB *ccb) 251 1.1 dante { 252 1.7 dante int hashnum, error; 253 1.1 dante 254 1.1 dante /* 255 1.1 dante * Create the DMA map for this CCB. 256 1.1 dante */ 257 1.1 dante error = bus_dmamap_create(sc->sc_dmat, 258 1.54 msaitoh (ADW_MAX_SG_LIST - 1) * PAGE_SIZE, ADW_MAX_SG_LIST, 259 1.54 msaitoh (ADW_MAX_SG_LIST - 1) * PAGE_SIZE, 0, 260 1.54 msaitoh BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ccb->dmamap_xfer); 261 1.1 dante if (error) { 262 1.54 msaitoh aprint_error_dev(sc->sc_dev, 263 1.54 msaitoh "unable to create CCB DMA map, error = %d\n", error); 264 1.1 dante return (error); 265 1.1 dante } 266 1.7 dante 267 1.7 dante /* 268 1.7 dante * put in the phystokv hash table 269 1.7 dante * Never gets taken out. 270 1.7 dante */ 271 1.35 briggs ccb->hashkey = htole32(sc->sc_dmamap_control->dm_segs[0].ds_addr + 272 1.35 briggs ADW_CCB_OFF(ccb)); 273 1.7 dante hashnum = CCB_HASH(ccb->hashkey); 274 1.7 dante ccb->nexthash = sc->sc_ccbhash[hashnum]; 275 1.7 dante sc->sc_ccbhash[hashnum] = ccb; 276 1.1 dante adw_reset_ccb(ccb); 277 1.1 dante return (0); 278 1.1 dante } 279 1.1 dante 280 1.1 dante 281 1.1 dante /* 282 1.1 dante * Get a free ccb 283 1.1 dante * 284 1.1 dante * If there are none, see if we can allocate a new one 285 1.1 dante */ 286 1.1 dante static ADW_CCB * 287 1.30 lukem adw_get_ccb(ADW_SOFTC *sc) 288 1.1 dante { 289 1.1 dante ADW_CCB *ccb = 0; 290 1.1 dante int s; 291 1.1 dante 292 1.1 dante s = splbio(); 293 1.1 dante 294 1.29 bouyer ccb = sc->sc_free_ccb.tqh_first; 295 1.29 bouyer if (ccb != NULL) { 296 1.29 bouyer TAILQ_REMOVE(&sc->sc_free_ccb, ccb, chain); 297 1.29 bouyer ccb->flags |= CCB_ALLOC; 298 1.1 dante } 299 1.1 dante splx(s); 300 1.1 dante return (ccb); 301 1.1 dante } 302 1.1 dante 303 1.1 dante 304 1.1 dante /* 305 1.7 dante * Given a physical address, find the ccb that it corresponds to. 306 1.7 dante */ 307 1.7 dante ADW_CCB * 308 1.30 lukem adw_ccb_phys_kv(ADW_SOFTC *sc, u_int32_t ccb_phys) 309 1.7 dante { 310 1.7 dante int hashnum = CCB_HASH(ccb_phys); 311 1.7 dante ADW_CCB *ccb = sc->sc_ccbhash[hashnum]; 312 1.7 dante 313 1.7 dante while (ccb) { 314 1.7 dante if (ccb->hashkey == ccb_phys) 315 1.7 dante break; 316 1.7 dante ccb = ccb->nexthash; 317 1.7 dante } 318 1.7 dante return (ccb); 319 1.7 dante } 320 1.7 dante 321 1.7 dante 322 1.7 dante /* 323 1.1 dante * Queue a CCB to be sent to the controller, and send it if possible. 324 1.1 dante */ 325 1.13 dante static int 326 1.30 lukem adw_queue_ccb(ADW_SOFTC *sc, ADW_CCB *ccb) 327 1.1 dante { 328 1.19 dante int errcode = ADW_SUCCESS; 329 1.1 dante 330 1.29 bouyer TAILQ_INSERT_TAIL(&sc->sc_waiting_ccb, ccb, chain); 331 1.1 dante 332 1.13 dante while ((ccb = sc->sc_waiting_ccb.tqh_first) != NULL) { 333 1.1 dante 334 1.29 bouyer TAILQ_REMOVE(&sc->sc_waiting_ccb, ccb, chain); 335 1.22 dante errcode = AdwExeScsiQueue(sc, &ccb->scsiq); 336 1.13 dante switch(errcode) { 337 1.13 dante case ADW_SUCCESS: 338 1.13 dante break; 339 1.1 dante 340 1.13 dante case ADW_BUSY: 341 1.13 dante printf("ADW_BUSY\n"); 342 1.13 dante return(ADW_BUSY); 343 1.13 dante 344 1.13 dante case ADW_ERROR: 345 1.13 dante printf("ADW_ERROR\n"); 346 1.13 dante return(ADW_ERROR); 347 1.13 dante } 348 1.11 dante 349 1.19 dante TAILQ_INSERT_TAIL(&sc->sc_pending_ccb, ccb, chain); 350 1.1 dante 351 1.12 thorpej if ((ccb->xs->xs_control & XS_CTL_POLL) == 0) 352 1.15 thorpej callout_reset(&ccb->xs->xs_callout, 353 1.38 bouyer mstohz(ccb->timeout), adw_timeout, ccb); 354 1.1 dante } 355 1.13 dante 356 1.13 dante return(errcode); 357 1.1 dante } 358 1.1 dante 359 1.1 dante 360 1.1 dante /******************************************************************************/ 361 1.22 dante /* SCSI layer interfacing routines */ 362 1.1 dante /******************************************************************************/ 363 1.1 dante 364 1.1 dante 365 1.1 dante int 366 1.30 lukem adw_init(ADW_SOFTC *sc) 367 1.1 dante { 368 1.2 dante u_int16_t warn_code; 369 1.1 dante 370 1.1 dante 371 1.1 dante sc->cfg.lib_version = (ADW_LIB_VERSION_MAJOR << 8) | 372 1.2 dante ADW_LIB_VERSION_MINOR; 373 1.1 dante sc->cfg.chip_version = 374 1.1 dante ADW_GET_CHIP_VERSION(sc->sc_iot, sc->sc_ioh, sc->bus_type); 375 1.1 dante 376 1.1 dante /* 377 1.1 dante * Reset the chip to start and allow register writes. 378 1.1 dante */ 379 1.1 dante if (ADW_FIND_SIGNATURE(sc->sc_iot, sc->sc_ioh) == 0) { 380 1.1 dante panic("adw_init: adw_find_signature failed"); 381 1.2 dante } else { 382 1.22 dante AdwResetChip(sc->sc_iot, sc->sc_ioh); 383 1.1 dante 384 1.23 dante warn_code = AdwInitFromEEPROM(sc); 385 1.13 dante 386 1.22 dante if (warn_code & ADW_WARN_EEPROM_CHKSUM) 387 1.52 chs aprint_error_dev(sc->sc_dev, "Bad checksum found. " 388 1.54 msaitoh "Setting default values\n"); 389 1.22 dante if (warn_code & ADW_WARN_EEPROM_TERMINATION) 390 1.54 msaitoh aprint_error_dev(sc->sc_dev, "Bad bus termination " 391 1.54 msaitoh "setting. Using automatic termination.\n"); 392 1.1 dante } 393 1.1 dante 394 1.55 uwe sc->isr_callback = adw_isr_callback; 395 1.55 uwe sc->async_callback = adw_async_callback; 396 1.1 dante 397 1.16 dante return 0; 398 1.1 dante } 399 1.1 dante 400 1.1 dante 401 1.1 dante void 402 1.30 lukem adw_attach(ADW_SOFTC *sc) 403 1.1 dante { 404 1.29 bouyer struct scsipi_adapter *adapt = &sc->sc_adapter; 405 1.29 bouyer struct scsipi_channel *chan = &sc->sc_channel; 406 1.29 bouyer int ncontrols, error; 407 1.1 dante 408 1.13 dante TAILQ_INIT(&sc->sc_free_ccb); 409 1.13 dante TAILQ_INIT(&sc->sc_waiting_ccb); 410 1.19 dante TAILQ_INIT(&sc->sc_pending_ccb); 411 1.13 dante 412 1.13 dante /* 413 1.13 dante * Allocate the Control Blocks. 414 1.13 dante */ 415 1.13 dante error = adw_alloc_controls(sc); 416 1.13 dante if (error) 417 1.13 dante return; /* (error) */ ; 418 1.13 dante 419 1.32 thorpej memset(sc->sc_control, 0, sizeof(struct adw_control)); 420 1.13 dante 421 1.13 dante /* 422 1.13 dante * Create and initialize the Control Blocks. 423 1.13 dante */ 424 1.29 bouyer ncontrols = adw_create_ccbs(sc, sc->sc_control->ccbs, ADW_MAX_CCB); 425 1.29 bouyer if (ncontrols == 0) { 426 1.53 msaitoh aprint_error_dev(sc->sc_dev, 427 1.53 msaitoh "unable to create Control Blocks\n"); 428 1.13 dante return; /* (ENOMEM) */ ; 429 1.29 bouyer } else if (ncontrols != ADW_MAX_CCB) { 430 1.53 msaitoh aprint_error_dev(sc->sc_dev, 431 1.53 msaitoh "WARNING: only %d of %d Control Blocks created\n", 432 1.49 cegger ncontrols, ADW_MAX_CCB); 433 1.13 dante } 434 1.13 dante 435 1.13 dante /* 436 1.13 dante * Create and initialize the Carriers. 437 1.13 dante */ 438 1.13 dante error = adw_alloc_carriers(sc); 439 1.13 dante if (error) 440 1.13 dante return; /* (error) */ ; 441 1.13 dante 442 1.21 dante /* 443 1.21 dante * Zero's the freeze_device status 444 1.21 dante */ 445 1.32 thorpej memset(sc->sc_freeze_dev, 0, sizeof(sc->sc_freeze_dev)); 446 1.13 dante 447 1.1 dante /* 448 1.16 dante * Initialize the adapter 449 1.1 dante */ 450 1.23 dante switch (AdwInitDriver(sc)) { 451 1.22 dante case ADW_IERR_BIST_PRE_TEST: 452 1.19 dante panic("%s: BIST pre-test error", 453 1.52 chs device_xname(sc->sc_dev)); 454 1.19 dante break; 455 1.19 dante 456 1.22 dante case ADW_IERR_BIST_RAM_TEST: 457 1.19 dante panic("%s: BIST RAM test error", 458 1.52 chs device_xname(sc->sc_dev)); 459 1.19 dante break; 460 1.19 dante 461 1.22 dante case ADW_IERR_MCODE_CHKSUM: 462 1.2 dante panic("%s: Microcode checksum error", 463 1.52 chs device_xname(sc->sc_dev)); 464 1.2 dante break; 465 1.2 dante 466 1.22 dante case ADW_IERR_ILLEGAL_CONNECTION: 467 1.2 dante panic("%s: All three connectors are in use", 468 1.52 chs device_xname(sc->sc_dev)); 469 1.2 dante break; 470 1.2 dante 471 1.22 dante case ADW_IERR_REVERSED_CABLE: 472 1.2 dante panic("%s: Cable is reversed", 473 1.52 chs device_xname(sc->sc_dev)); 474 1.2 dante break; 475 1.2 dante 476 1.22 dante case ADW_IERR_HVD_DEVICE: 477 1.19 dante panic("%s: HVD attached to LVD connector", 478 1.52 chs device_xname(sc->sc_dev)); 479 1.19 dante break; 480 1.19 dante 481 1.22 dante case ADW_IERR_SINGLE_END_DEVICE: 482 1.2 dante panic("%s: single-ended device is attached to" 483 1.2 dante " one of the connectors", 484 1.52 chs device_xname(sc->sc_dev)); 485 1.2 dante break; 486 1.13 dante 487 1.22 dante case ADW_IERR_NO_CARRIER: 488 1.22 dante panic("%s: unable to create Carriers", 489 1.52 chs device_xname(sc->sc_dev)); 490 1.13 dante break; 491 1.13 dante 492 1.22 dante case ADW_WARN_BUSRESET_ERROR: 493 1.52 chs aprint_error_dev(sc->sc_dev, "WARNING: Bus Reset Error\n"); 494 1.13 dante break; 495 1.1 dante } 496 1.1 dante 497 1.4 thorpej /* 498 1.29 bouyer * Fill in the scsipi_adapter. 499 1.4 thorpej */ 500 1.29 bouyer memset(adapt, 0, sizeof(*adapt)); 501 1.52 chs adapt->adapt_dev = sc->sc_dev; 502 1.29 bouyer adapt->adapt_nchannels = 1; 503 1.29 bouyer adapt->adapt_openings = ncontrols; 504 1.29 bouyer adapt->adapt_max_periph = adapt->adapt_openings; 505 1.29 bouyer adapt->adapt_request = adw_scsipi_request; 506 1.29 bouyer adapt->adapt_minphys = adwminphys; 507 1.1 dante 508 1.1 dante /* 509 1.29 bouyer * Fill in the scsipi_channel. 510 1.29 bouyer */ 511 1.29 bouyer memset(chan, 0, sizeof(*chan)); 512 1.45 perry chan->chan_adapter = adapt; 513 1.29 bouyer chan->chan_bustype = &scsi_bustype; 514 1.29 bouyer chan->chan_channel = 0; 515 1.29 bouyer chan->chan_ntargets = ADW_MAX_TID + 1; 516 1.41 mycroft chan->chan_nluns = 8; 517 1.29 bouyer chan->chan_id = sc->chip_scsi_id; 518 1.1 dante 519 1.59 thorpej config_found(sc->sc_dev, &sc->sc_channel, scsiprint, CFARGS_NONE); 520 1.1 dante } 521 1.1 dante 522 1.1 dante 523 1.1 dante static void 524 1.30 lukem adwminphys(struct buf *bp) 525 1.1 dante { 526 1.1 dante 527 1.1 dante if (bp->b_bcount > ((ADW_MAX_SG_LIST - 1) * PAGE_SIZE)) 528 1.1 dante bp->b_bcount = ((ADW_MAX_SG_LIST - 1) * PAGE_SIZE); 529 1.1 dante minphys(bp); 530 1.1 dante } 531 1.1 dante 532 1.1 dante 533 1.1 dante /* 534 1.2 dante * start a scsi operation given the command and the data address. 535 1.2 dante * Also needs the unit, target and lu. 536 1.1 dante */ 537 1.29 bouyer static void 538 1.30 lukem adw_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req, 539 1.30 lukem void *arg) 540 1.29 bouyer { 541 1.1 dante struct scsipi_xfer *xs; 542 1.52 chs ADW_SOFTC *sc = device_private(chan->chan_adapter->adapt_dev); 543 1.1 dante ADW_CCB *ccb; 544 1.29 bouyer int s, retry; 545 1.1 dante 546 1.29 bouyer switch (req) { 547 1.29 bouyer case ADAPTER_REQ_RUN_XFER: 548 1.29 bouyer xs = arg; 549 1.1 dante 550 1.29 bouyer /* 551 1.29 bouyer * get a ccb to use. If the transfer 552 1.29 bouyer * is from a buf (possibly from interrupt time) 553 1.29 bouyer * then we can't allow it to sleep 554 1.29 bouyer */ 555 1.1 dante 556 1.29 bouyer ccb = adw_get_ccb(sc); 557 1.29 bouyer #ifdef DIAGNOSTIC 558 1.1 dante /* 559 1.29 bouyer * This should never happen as we track the resources 560 1.29 bouyer * in the mid-layer. 561 1.1 dante */ 562 1.29 bouyer if (ccb == NULL) { 563 1.29 bouyer scsipi_printaddr(xs->xs_periph); 564 1.29 bouyer printf("unable to allocate ccb\n"); 565 1.29 bouyer panic("adw_scsipi_request"); 566 1.1 dante } 567 1.29 bouyer #endif 568 1.1 dante 569 1.29 bouyer ccb->xs = xs; 570 1.29 bouyer ccb->timeout = xs->timeout; 571 1.1 dante 572 1.29 bouyer if (adw_build_req(sc, ccb)) { 573 1.29 bouyer s = splbio(); 574 1.29 bouyer retry = adw_queue_ccb(sc, ccb); 575 1.1 dante splx(s); 576 1.1 dante 577 1.29 bouyer switch(retry) { 578 1.29 bouyer case ADW_BUSY: 579 1.29 bouyer xs->error = XS_RESOURCE_SHORTAGE; 580 1.29 bouyer adw_free_ccb(sc, ccb); 581 1.29 bouyer scsipi_done(xs); 582 1.29 bouyer return; 583 1.1 dante 584 1.29 bouyer case ADW_ERROR: 585 1.29 bouyer xs->error = XS_DRIVER_STUFFUP; 586 1.29 bouyer adw_free_ccb(sc, ccb); 587 1.29 bouyer scsipi_done(xs); 588 1.29 bouyer return; 589 1.29 bouyer } 590 1.29 bouyer if ((xs->xs_control & XS_CTL_POLL) == 0) 591 1.29 bouyer return; 592 1.29 bouyer /* 593 1.29 bouyer * Not allowed to use interrupts, poll for completion. 594 1.29 bouyer */ 595 1.29 bouyer if (adw_poll(sc, xs, ccb->timeout)) { 596 1.29 bouyer adw_timeout(ccb); 597 1.29 bouyer if (adw_poll(sc, xs, ccb->timeout)) 598 1.29 bouyer adw_timeout(ccb); 599 1.29 bouyer } 600 1.13 dante } 601 1.29 bouyer return; 602 1.1 dante 603 1.29 bouyer case ADAPTER_REQ_GROW_RESOURCES: 604 1.29 bouyer /* XXX Not supported. */ 605 1.29 bouyer return; 606 1.1 dante 607 1.29 bouyer case ADAPTER_REQ_SET_XFER_MODE: 608 1.45 perry /* XXX XXX XXX */ 609 1.29 bouyer return; 610 1.1 dante } 611 1.1 dante } 612 1.1 dante 613 1.1 dante 614 1.1 dante /* 615 1.1 dante * Build a request structure for the Wide Boards. 616 1.1 dante */ 617 1.1 dante static int 618 1.30 lukem adw_build_req(ADW_SOFTC *sc, ADW_CCB *ccb) 619 1.1 dante { 620 1.29 bouyer struct scsipi_xfer *xs = ccb->xs; 621 1.29 bouyer struct scsipi_periph *periph = xs->xs_periph; 622 1.2 dante bus_dma_tag_t dmat = sc->sc_dmat; 623 1.2 dante ADW_SCSI_REQ_Q *scsiqp; 624 1.2 dante int error; 625 1.1 dante 626 1.1 dante scsiqp = &ccb->scsiq; 627 1.32 thorpej memset(scsiqp, 0, sizeof(ADW_SCSI_REQ_Q)); 628 1.1 dante 629 1.1 dante /* 630 1.7 dante * Set the ADW_SCSI_REQ_Q 'ccb_ptr' to point to the 631 1.7 dante * physical CCB structure. 632 1.1 dante */ 633 1.10 thorpej scsiqp->ccb_ptr = ccb->hashkey; 634 1.1 dante 635 1.1 dante /* 636 1.1 dante * Build the ADW_SCSI_REQ_Q request. 637 1.1 dante */ 638 1.1 dante 639 1.1 dante /* 640 1.1 dante * Set CDB length and copy it to the request structure. 641 1.16 dante * For wide boards a CDB length maximum of 16 bytes 642 1.16 dante * is supported. 643 1.1 dante */ 644 1.31 thorpej memcpy(&scsiqp->cdb, xs->cmd, ((scsiqp->cdb_len = xs->cmdlen) <= 12)? 645 1.16 dante xs->cmdlen : 12 ); 646 1.16 dante if(xs->cmdlen > 12) 647 1.31 thorpej memcpy(&scsiqp->cdb16, &(xs->cmd[12]), xs->cmdlen - 12); 648 1.1 dante 649 1.29 bouyer scsiqp->target_id = periph->periph_target; 650 1.29 bouyer scsiqp->target_lun = periph->periph_lun; 651 1.1 dante 652 1.7 dante scsiqp->vsense_addr = &ccb->scsi_sense; 653 1.35 briggs scsiqp->sense_addr = htole32(sc->sc_dmamap_control->dm_segs[0].ds_addr + 654 1.35 briggs ADW_CCB_OFF(ccb) + offsetof(struct adw_ccb, scsi_sense)); 655 1.44 thorpej scsiqp->sense_len = sizeof(struct scsi_sense_data); 656 1.1 dante 657 1.1 dante /* 658 1.1 dante * Build ADW_SCSI_REQ_Q for a scatter-gather buffer command. 659 1.1 dante */ 660 1.1 dante if (xs->datalen) { 661 1.1 dante /* 662 1.1 dante * Map the DMA transfer. 663 1.1 dante */ 664 1.1 dante #ifdef TFS 665 1.12 thorpej if (xs->xs_control & SCSI_DATA_UIO) { 666 1.29 bouyer error = bus_dmamap_load_uio(dmat, 667 1.29 bouyer ccb->dmamap_xfer, (struct uio *) xs->data, 668 1.29 bouyer ((flags & XS_CTL_NOSLEEP) ? BUS_DMA_NOWAIT : 669 1.33 thorpej BUS_DMA_WAITOK) | BUS_DMA_STREAMING | 670 1.33 thorpej ((flags & XS_CTL_DATA_IN) ? BUS_DMA_READ : 671 1.33 thorpej BUS_DMA_WRITE)); 672 1.1 dante } else 673 1.13 dante #endif /* TFS */ 674 1.1 dante { 675 1.29 bouyer error = bus_dmamap_load(dmat, 676 1.29 bouyer ccb->dmamap_xfer, xs->data, xs->datalen, NULL, 677 1.29 bouyer ((xs->xs_control & XS_CTL_NOSLEEP) ? 678 1.29 bouyer BUS_DMA_NOWAIT : BUS_DMA_WAITOK) | 679 1.33 thorpej BUS_DMA_STREAMING | 680 1.33 thorpej ((xs->xs_control & XS_CTL_DATA_IN) ? 681 1.33 thorpej BUS_DMA_READ : BUS_DMA_WRITE)); 682 1.1 dante } 683 1.1 dante 684 1.29 bouyer switch (error) { 685 1.29 bouyer case 0: 686 1.29 bouyer break; 687 1.29 bouyer case ENOMEM: 688 1.29 bouyer case EAGAIN: 689 1.29 bouyer xs->error = XS_RESOURCE_SHORTAGE; 690 1.45 perry goto out_bad; 691 1.1 dante 692 1.29 bouyer default: 693 1.1 dante xs->error = XS_DRIVER_STUFFUP; 694 1.54 msaitoh aprint_error_dev(sc->sc_dev, 695 1.54 msaitoh "error %d loading DMA map\n", error); 696 1.29 bouyer out_bad: 697 1.1 dante adw_free_ccb(sc, ccb); 698 1.29 bouyer scsipi_done(xs); 699 1.29 bouyer return(0); 700 1.1 dante } 701 1.29 bouyer 702 1.1 dante bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0, 703 1.29 bouyer ccb->dmamap_xfer->dm_mapsize, 704 1.29 bouyer (xs->xs_control & XS_CTL_DATA_IN) ? 705 1.29 bouyer BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE); 706 1.1 dante 707 1.1 dante /* 708 1.1 dante * Build scatter-gather list. 709 1.1 dante */ 710 1.35 briggs scsiqp->data_cnt = htole32(xs->datalen); 711 1.7 dante scsiqp->vdata_addr = xs->data; 712 1.35 briggs scsiqp->data_addr = htole32(ccb->dmamap_xfer->dm_segs[0].ds_addr); 713 1.32 thorpej memset(ccb->sg_block, 0, 714 1.32 thorpej sizeof(ADW_SG_BLOCK) * ADW_NUM_SG_BLOCK); 715 1.7 dante adw_build_sglist(ccb, scsiqp, ccb->sg_block); 716 1.1 dante } else { 717 1.1 dante /* 718 1.1 dante * No data xfer, use non S/G values. 719 1.1 dante */ 720 1.1 dante scsiqp->data_cnt = 0; 721 1.1 dante scsiqp->vdata_addr = 0; 722 1.1 dante scsiqp->data_addr = 0; 723 1.1 dante } 724 1.1 dante 725 1.1 dante return (1); 726 1.1 dante } 727 1.1 dante 728 1.1 dante 729 1.1 dante /* 730 1.1 dante * Build scatter-gather list for Wide Boards. 731 1.1 dante */ 732 1.1 dante static void 733 1.30 lukem adw_build_sglist(ADW_CCB *ccb, ADW_SCSI_REQ_Q *scsiqp, ADW_SG_BLOCK *sg_block) 734 1.1 dante { 735 1.9 thorpej u_long sg_block_next_addr; /* block and its next */ 736 1.9 thorpej u_int32_t sg_block_physical_addr; 737 1.13 dante int i; /* how many SG entries */ 738 1.1 dante bus_dma_segment_t *sg_list = &ccb->dmamap_xfer->dm_segs[0]; 739 1.2 dante int sg_elem_cnt = ccb->dmamap_xfer->dm_nsegs; 740 1.1 dante 741 1.1 dante 742 1.9 thorpej sg_block_next_addr = (u_long) sg_block; /* allow math operation */ 743 1.35 briggs sg_block_physical_addr = le32toh(ccb->hashkey) + 744 1.10 thorpej offsetof(struct adw_ccb, sg_block[0]); 745 1.35 briggs scsiqp->sg_real_addr = htole32(sg_block_physical_addr); 746 1.1 dante 747 1.1 dante /* 748 1.40 wiz * If there are more than NO_OF_SG_PER_BLOCK DMA segments (hw sg-list) 749 1.1 dante * then split the request into multiple sg-list blocks. 750 1.1 dante */ 751 1.1 dante 752 1.2 dante do { 753 1.2 dante for (i = 0; i < NO_OF_SG_PER_BLOCK; i++) { 754 1.35 briggs sg_block->sg_list[i].sg_addr = htole32(sg_list->ds_addr); 755 1.35 briggs sg_block->sg_list[i].sg_count = htole32(sg_list->ds_len); 756 1.1 dante 757 1.2 dante if (--sg_elem_cnt == 0) { 758 1.1 dante /* last entry, get out */ 759 1.27 hpeyerl sg_block->sg_cnt = i + 1; 760 1.42 fvdl sg_block->sg_ptr = 0; /* next link = NULL */ 761 1.1 dante return; 762 1.1 dante } 763 1.1 dante sg_list++; 764 1.1 dante } 765 1.1 dante sg_block_next_addr += sizeof(ADW_SG_BLOCK); 766 1.1 dante sg_block_physical_addr += sizeof(ADW_SG_BLOCK); 767 1.1 dante 768 1.13 dante sg_block->sg_cnt = NO_OF_SG_PER_BLOCK; 769 1.35 briggs sg_block->sg_ptr = htole32(sg_block_physical_addr); 770 1.2 dante sg_block = (ADW_SG_BLOCK *) sg_block_next_addr; /* virt. addr */ 771 1.10 thorpej } while (1); 772 1.1 dante } 773 1.1 dante 774 1.1 dante 775 1.22 dante /******************************************************************************/ 776 1.22 dante /* Interrupts and TimeOut routines */ 777 1.22 dante /******************************************************************************/ 778 1.22 dante 779 1.22 dante 780 1.1 dante int 781 1.30 lukem adw_intr(void *arg) 782 1.1 dante { 783 1.1 dante ADW_SOFTC *sc = arg; 784 1.1 dante 785 1.1 dante 786 1.22 dante if(AdwISR(sc) != ADW_FALSE) { 787 1.16 dante return (1); 788 1.13 dante } 789 1.1 dante 790 1.16 dante return (0); 791 1.1 dante } 792 1.1 dante 793 1.1 dante 794 1.1 dante /* 795 1.1 dante * Poll a particular unit, looking for a particular xs 796 1.1 dante */ 797 1.1 dante static int 798 1.30 lukem adw_poll(ADW_SOFTC *sc, struct scsipi_xfer *xs, int count) 799 1.1 dante { 800 1.1 dante 801 1.1 dante /* timeouts are in msec, so we loop in 1000 usec cycles */ 802 1.1 dante while (count) { 803 1.1 dante adw_intr(sc); 804 1.12 thorpej if (xs->xs_status & XS_STS_DONE) 805 1.1 dante return (0); 806 1.1 dante delay(1000); /* only happens in boot so ok */ 807 1.1 dante count--; 808 1.1 dante } 809 1.1 dante return (1); 810 1.1 dante } 811 1.1 dante 812 1.1 dante 813 1.1 dante static void 814 1.30 lukem adw_timeout(void *arg) 815 1.1 dante { 816 1.1 dante ADW_CCB *ccb = arg; 817 1.1 dante struct scsipi_xfer *xs = ccb->xs; 818 1.29 bouyer struct scsipi_periph *periph = xs->xs_periph; 819 1.29 bouyer ADW_SOFTC *sc = 820 1.52 chs device_private(periph->periph_channel->chan_adapter->adapt_dev); 821 1.1 dante int s; 822 1.1 dante 823 1.29 bouyer scsipi_printaddr(periph); 824 1.1 dante printf("timed out"); 825 1.1 dante 826 1.1 dante s = splbio(); 827 1.1 dante 828 1.11 dante if (ccb->flags & CCB_ABORTED) { 829 1.11 dante /* 830 1.11 dante * Abort Timed Out 831 1.19 dante * 832 1.20 dante * No more opportunities. Lets try resetting the bus and 833 1.20 dante * reinitialize the host adapter. 834 1.11 dante */ 835 1.19 dante callout_stop(&xs->xs_callout); 836 1.11 dante printf(" AGAIN. Resetting SCSI Bus\n"); 837 1.22 dante adw_reset_bus(sc); 838 1.19 dante splx(s); 839 1.19 dante return; 840 1.19 dante } else if (ccb->flags & CCB_ABORTING) { 841 1.19 dante /* 842 1.20 dante * Abort the operation that has timed out. 843 1.19 dante * 844 1.19 dante * Second opportunity. 845 1.19 dante */ 846 1.19 dante printf("\n"); 847 1.19 dante xs->error = XS_TIMEOUT; 848 1.19 dante ccb->flags |= CCB_ABORTED; 849 1.19 dante #if 0 850 1.19 dante /* 851 1.19 dante * - XXX - 3.3a microcode is BROKEN!!! 852 1.19 dante * 853 1.19 dante * We cannot abort a CCB, so we can only hope the command 854 1.19 dante * get completed before the next timeout, otherwise a 855 1.19 dante * Bus Reset will arrive inexorably. 856 1.19 dante */ 857 1.19 dante /* 858 1.19 dante * ADW_ABORT_CCB() makes the board to generate an interrupt 859 1.19 dante * 860 1.19 dante * - XXX - The above assertion MUST be verified (and this 861 1.19 dante * code changed as well [callout_*()]), when the 862 1.19 dante * ADW_ABORT_CCB will be working again 863 1.19 dante */ 864 1.19 dante ADW_ABORT_CCB(sc, ccb); 865 1.19 dante #endif 866 1.19 dante /* 867 1.19 dante * waiting for multishot callout_reset() let's restart it 868 1.43 wiz * by hand so the next time a timeout event will occur 869 1.19 dante * we will reset the bus. 870 1.19 dante */ 871 1.19 dante callout_reset(&xs->xs_callout, 872 1.38 bouyer mstohz(ccb->timeout), adw_timeout, ccb); 873 1.1 dante } else { 874 1.11 dante /* 875 1.20 dante * Abort the operation that has timed out. 876 1.19 dante * 877 1.19 dante * First opportunity. 878 1.11 dante */ 879 1.1 dante printf("\n"); 880 1.11 dante xs->error = XS_TIMEOUT; 881 1.11 dante ccb->flags |= CCB_ABORTING; 882 1.19 dante #if 0 883 1.19 dante /* 884 1.19 dante * - XXX - 3.3a microcode is BROKEN!!! 885 1.19 dante * 886 1.19 dante * We cannot abort a CCB, so we can only hope the command 887 1.19 dante * get completed before the next 2 timeout, otherwise a 888 1.19 dante * Bus Reset will arrive inexorably. 889 1.19 dante */ 890 1.19 dante /* 891 1.19 dante * ADW_ABORT_CCB() makes the board to generate an interrupt 892 1.19 dante * 893 1.19 dante * - XXX - The above assertion MUST be verified (and this 894 1.19 dante * code changed as well [callout_*()]), when the 895 1.19 dante * ADW_ABORT_CCB will be working again 896 1.19 dante */ 897 1.1 dante ADW_ABORT_CCB(sc, ccb); 898 1.19 dante #endif 899 1.19 dante /* 900 1.19 dante * waiting for multishot callout_reset() let's restart it 901 1.20 dante * by hand so to give a second opportunity to the command 902 1.20 dante * which timed-out. 903 1.19 dante */ 904 1.19 dante callout_reset(&xs->xs_callout, 905 1.38 bouyer mstohz(ccb->timeout), adw_timeout, ccb); 906 1.1 dante } 907 1.1 dante 908 1.1 dante splx(s); 909 1.1 dante } 910 1.1 dante 911 1.1 dante 912 1.21 dante static void 913 1.30 lukem adw_reset_bus(ADW_SOFTC *sc) 914 1.21 dante { 915 1.21 dante ADW_CCB *ccb; 916 1.21 dante int s; 917 1.29 bouyer struct scsipi_xfer *xs; 918 1.21 dante 919 1.21 dante s = splbio(); 920 1.22 dante AdwResetSCSIBus(sc); 921 1.21 dante while((ccb = TAILQ_LAST(&sc->sc_pending_ccb, 922 1.21 dante adw_pending_ccb)) != NULL) { 923 1.21 dante callout_stop(&ccb->xs->xs_callout); 924 1.21 dante TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain); 925 1.29 bouyer xs = ccb->xs; 926 1.29 bouyer adw_free_ccb(sc, ccb); 927 1.29 bouyer xs->error = XS_RESOURCE_SHORTAGE; 928 1.29 bouyer scsipi_done(xs); 929 1.21 dante } 930 1.21 dante splx(s); 931 1.21 dante } 932 1.21 dante 933 1.21 dante 934 1.1 dante /******************************************************************************/ 935 1.19 dante /* Host Adapter and Peripherals Information Routines */ 936 1.19 dante /******************************************************************************/ 937 1.19 dante 938 1.19 dante 939 1.19 dante static void 940 1.30 lukem adw_print_info(ADW_SOFTC *sc, int tid) 941 1.19 dante { 942 1.19 dante bus_space_tag_t iot = sc->sc_iot; 943 1.19 dante bus_space_handle_t ioh = sc->sc_ioh; 944 1.19 dante u_int16_t wdtr_able, wdtr_done, wdtr; 945 1.19 dante u_int16_t sdtr_able, sdtr_done, sdtr, period; 946 1.20 dante static int wdtr_reneg = 0, sdtr_reneg = 0; 947 1.20 dante 948 1.20 dante if (tid == 0){ 949 1.20 dante wdtr_reneg = sdtr_reneg = 0; 950 1.20 dante } 951 1.19 dante 952 1.52 chs printf("%s: target %d ", device_xname(sc->sc_dev), tid); 953 1.19 dante 954 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, wdtr_able); 955 1.19 dante if(wdtr_able & ADW_TID_TO_TIDMASK(tid)) { 956 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE, wdtr_done); 957 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_DEVICE_HSHK_CFG_TABLE + 958 1.19 dante (2 * tid), wdtr); 959 1.19 dante printf("using %d-bits wide, ", (wdtr & 0x8000)? 16 : 8); 960 1.19 dante if((wdtr_done & ADW_TID_TO_TIDMASK(tid)) == 0) 961 1.19 dante wdtr_reneg = 1; 962 1.19 dante } else { 963 1.19 dante printf("wide transfers disabled, "); 964 1.19 dante } 965 1.19 dante 966 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_ABLE, sdtr_able); 967 1.19 dante if(sdtr_able & ADW_TID_TO_TIDMASK(tid)) { 968 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_SDTR_DONE, sdtr_done); 969 1.22 dante ADW_READ_WORD_LRAM(iot, ioh, ADW_MC_DEVICE_HSHK_CFG_TABLE + 970 1.19 dante (2 * tid), sdtr); 971 1.19 dante sdtr &= ~0x8000; 972 1.19 dante if((sdtr & 0x1F) != 0) { 973 1.19 dante if((sdtr & 0x1F00) == 0x1100){ 974 1.19 dante printf("80.0 MHz"); 975 1.19 dante } else if((sdtr & 0x1F00) == 0x1000){ 976 1.19 dante printf("40.0 MHz"); 977 1.19 dante } else { 978 1.19 dante /* <= 20.0 MHz */ 979 1.19 dante period = (((sdtr >> 8) * 25) + 50)/4; 980 1.19 dante if(period == 0) { 981 1.19 dante /* Should never happen. */ 982 1.19 dante printf("? MHz"); 983 1.19 dante } else { 984 1.19 dante printf("%d.%d MHz", 250/period, 985 1.19 dante ADW_TENTHS(250, period)); 986 1.19 dante } 987 1.19 dante } 988 1.19 dante printf(" synchronous transfers\n"); 989 1.19 dante } else { 990 1.19 dante printf("asynchronous transfers\n"); 991 1.19 dante } 992 1.19 dante if((sdtr_done & ADW_TID_TO_TIDMASK(tid)) == 0) 993 1.19 dante sdtr_reneg = 1; 994 1.19 dante } else { 995 1.19 dante printf("synchronous transfers disabled\n"); 996 1.19 dante } 997 1.19 dante 998 1.19 dante if(wdtr_reneg || sdtr_reneg) { 999 1.52 chs printf("%s: target %d %s", device_xname(sc->sc_dev), tid, 1000 1.19 dante (wdtr_reneg)? ((sdtr_reneg)? "wide/sync" : "wide") : 1001 1.19 dante ((sdtr_reneg)? "sync" : "") ); 1002 1.19 dante printf(" renegotiation pending before next command.\n"); 1003 1.19 dante } 1004 1.45 perry } 1005 1.19 dante 1006 1.19 dante 1007 1.19 dante /******************************************************************************/ 1008 1.19 dante /* WIDE boards Interrupt callbacks */ 1009 1.1 dante /******************************************************************************/ 1010 1.1 dante 1011 1.1 dante 1012 1.1 dante /* 1013 1.22 dante * adw_isr_callback() - Second Level Interrupt Handler called by AdwISR() 1014 1.1 dante * 1015 1.1 dante * Interrupt callback function for the Wide SCSI Adv Library. 1016 1.19 dante * 1017 1.19 dante * Notice: 1018 1.22 dante * Interrupts are disabled by the caller (AdwISR() function), and will be 1019 1.19 dante * enabled at the end of the caller. 1020 1.1 dante */ 1021 1.1 dante static void 1022 1.30 lukem adw_isr_callback(ADW_SOFTC *sc, ADW_SCSI_REQ_Q *scsiq) 1023 1.1 dante { 1024 1.2 dante bus_dma_tag_t dmat = sc->sc_dmat; 1025 1.7 dante ADW_CCB *ccb; 1026 1.7 dante struct scsipi_xfer *xs; 1027 1.44 thorpej struct scsi_sense_data *s1, *s2; 1028 1.1 dante 1029 1.7 dante 1030 1.7 dante ccb = adw_ccb_phys_kv(sc, scsiq->ccb_ptr); 1031 1.11 dante 1032 1.15 thorpej callout_stop(&ccb->xs->xs_callout); 1033 1.11 dante 1034 1.7 dante xs = ccb->xs; 1035 1.1 dante 1036 1.1 dante /* 1037 1.1 dante * If we were a data transfer, unload the map that described 1038 1.1 dante * the data buffer. 1039 1.1 dante */ 1040 1.1 dante if (xs->datalen) { 1041 1.1 dante bus_dmamap_sync(dmat, ccb->dmamap_xfer, 0, 1042 1.1 dante ccb->dmamap_xfer->dm_mapsize, 1043 1.12 thorpej (xs->xs_control & XS_CTL_DATA_IN) ? 1044 1.12 thorpej BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 1045 1.1 dante bus_dmamap_unload(dmat, ccb->dmamap_xfer); 1046 1.1 dante } 1047 1.20 dante 1048 1.1 dante if ((ccb->flags & CCB_ALLOC) == 0) { 1049 1.52 chs aprint_error_dev(sc->sc_dev, "exiting ccb not allocated!\n"); 1050 1.1 dante Debugger(); 1051 1.1 dante return; 1052 1.1 dante } 1053 1.20 dante 1054 1.1 dante /* 1055 1.1 dante * 'done_status' contains the command's ending status. 1056 1.43 wiz * 'host_status' contains the host adapter status. 1057 1.20 dante * 'scsi_status' contains the scsi peripheral status. 1058 1.1 dante */ 1059 1.21 dante if ((scsiq->host_status == QHSTA_NO_ERROR) && 1060 1.21 dante ((scsiq->done_status == QD_NO_ERROR) || 1061 1.22 dante (scsiq->done_status == QD_WITH_ERROR))) { 1062 1.34 dante switch (scsiq->scsi_status) { 1063 1.21 dante case SCSI_STATUS_GOOD: 1064 1.21 dante if ((scsiq->cdb[0] == INQUIRY) && 1065 1.21 dante (scsiq->target_lun == 0)) { 1066 1.21 dante adw_print_info(sc, scsiq->target_id); 1067 1.21 dante } 1068 1.21 dante xs->error = XS_NOERROR; 1069 1.35 briggs xs->resid = le32toh(scsiq->data_cnt); 1070 1.21 dante sc->sc_freeze_dev[scsiq->target_id] = 0; 1071 1.21 dante break; 1072 1.21 dante 1073 1.21 dante case SCSI_STATUS_CHECK_CONDITION: 1074 1.21 dante case SCSI_STATUS_CMD_TERMINATED: 1075 1.21 dante s1 = &ccb->scsi_sense; 1076 1.21 dante s2 = &xs->sense.scsi_sense; 1077 1.21 dante *s2 = *s1; 1078 1.21 dante xs->error = XS_SENSE; 1079 1.21 dante sc->sc_freeze_dev[scsiq->target_id] = 1; 1080 1.21 dante break; 1081 1.21 dante 1082 1.21 dante default: 1083 1.21 dante xs->error = XS_BUSY; 1084 1.21 dante sc->sc_freeze_dev[scsiq->target_id] = 1; 1085 1.21 dante break; 1086 1.20 dante } 1087 1.21 dante } else if (scsiq->done_status == QD_ABORTED_BY_HOST) { 1088 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1089 1.21 dante } else { 1090 1.21 dante switch (scsiq->host_status) { 1091 1.21 dante case QHSTA_M_SEL_TIMEOUT: 1092 1.21 dante xs->error = XS_SELTIMEOUT; 1093 1.21 dante break; 1094 1.21 dante 1095 1.21 dante case QHSTA_M_SXFR_OFF_UFLW: 1096 1.21 dante case QHSTA_M_SXFR_OFF_OFLW: 1097 1.21 dante case QHSTA_M_DATA_OVER_RUN: 1098 1.54 msaitoh aprint_error_dev(sc->sc_dev, 1099 1.54 msaitoh "Overrun/Overflow/Underflow condition\n"); 1100 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1101 1.21 dante break; 1102 1.21 dante 1103 1.21 dante case QHSTA_M_SXFR_DESELECTED: 1104 1.21 dante case QHSTA_M_UNEXPECTED_BUS_FREE: 1105 1.52 chs aprint_error_dev(sc->sc_dev, "Unexpected BUS free\n"); 1106 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1107 1.21 dante break; 1108 1.21 dante 1109 1.21 dante case QHSTA_M_SCSI_BUS_RESET: 1110 1.21 dante case QHSTA_M_SCSI_BUS_RESET_UNSOL: 1111 1.52 chs aprint_error_dev(sc->sc_dev, "BUS Reset\n"); 1112 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1113 1.21 dante break; 1114 1.1 dante 1115 1.21 dante case QHSTA_M_BUS_DEVICE_RESET: 1116 1.52 chs aprint_error_dev(sc->sc_dev, "Device Reset\n"); 1117 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1118 1.21 dante break; 1119 1.20 dante 1120 1.21 dante case QHSTA_M_QUEUE_ABORTED: 1121 1.52 chs aprint_error_dev(sc->sc_dev, "Queue Aborted\n"); 1122 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1123 1.1 dante break; 1124 1.1 dante 1125 1.20 dante case QHSTA_M_SXFR_SDMA_ERR: 1126 1.21 dante case QHSTA_M_SXFR_SXFR_PERR: 1127 1.21 dante case QHSTA_M_RDMA_PERR: 1128 1.20 dante /* 1129 1.21 dante * DMA Error. This should *NEVER* happen! 1130 1.20 dante * 1131 1.20 dante * Lets try resetting the bus and reinitialize 1132 1.20 dante * the host adapter. 1133 1.20 dante */ 1134 1.54 msaitoh aprint_error_dev(sc->sc_dev, 1135 1.58 andvar "DMA Error. Resetting bus\n"); 1136 1.22 dante TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain); 1137 1.22 dante adw_reset_bus(sc); 1138 1.21 dante xs->error = XS_BUSY; 1139 1.22 dante goto done; 1140 1.45 perry 1141 1.21 dante case QHSTA_M_WTM_TIMEOUT: 1142 1.21 dante case QHSTA_M_SXFR_WD_TMO: 1143 1.21 dante /* The SCSI bus hung in a phase */ 1144 1.58 andvar printf("%s: Watch Dog timer expired. Resetting bus\n", 1145 1.52 chs device_xname(sc->sc_dev)); 1146 1.22 dante TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain); 1147 1.22 dante adw_reset_bus(sc); 1148 1.21 dante xs->error = XS_BUSY; 1149 1.22 dante goto done; 1150 1.21 dante 1151 1.21 dante case QHSTA_M_SXFR_XFR_PH_ERR: 1152 1.52 chs aprint_error_dev(sc->sc_dev, "Transfer Error\n"); 1153 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1154 1.21 dante break; 1155 1.21 dante 1156 1.21 dante case QHSTA_M_BAD_CMPL_STATUS_IN: 1157 1.21 dante /* No command complete after a status message */ 1158 1.21 dante printf("%s: Bad Completion Status\n", 1159 1.52 chs device_xname(sc->sc_dev)); 1160 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1161 1.21 dante break; 1162 1.21 dante 1163 1.21 dante case QHSTA_M_AUTO_REQ_SENSE_FAIL: 1164 1.52 chs aprint_error_dev(sc->sc_dev, "Auto Sense Failed\n"); 1165 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1166 1.21 dante break; 1167 1.21 dante 1168 1.21 dante case QHSTA_M_INVALID_DEVICE: 1169 1.52 chs aprint_error_dev(sc->sc_dev, "Invalid Device\n"); 1170 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1171 1.21 dante break; 1172 1.11 dante 1173 1.21 dante case QHSTA_M_NO_AUTO_REQ_SENSE: 1174 1.21 dante /* 1175 1.21 dante * User didn't request sense, but we got a 1176 1.21 dante * check condition. 1177 1.21 dante */ 1178 1.54 msaitoh aprint_error_dev(sc->sc_dev, 1179 1.54 msaitoh "Unexpected Check Condition\n"); 1180 1.1 dante xs->error = XS_DRIVER_STUFFUP; 1181 1.1 dante break; 1182 1.1 dante 1183 1.21 dante case QHSTA_M_SXFR_UNKNOWN_ERROR: 1184 1.52 chs aprint_error_dev(sc->sc_dev, "Unknown Error\n"); 1185 1.21 dante xs->error = XS_DRIVER_STUFFUP; 1186 1.21 dante break; 1187 1.11 dante 1188 1.21 dante default: 1189 1.21 dante panic("%s: Unhandled Host Status Error %x", 1190 1.52 chs device_xname(sc->sc_dev), scsiq->host_status); 1191 1.21 dante } 1192 1.1 dante } 1193 1.1 dante 1194 1.19 dante TAILQ_REMOVE(&sc->sc_pending_ccb, ccb, chain); 1195 1.22 dante done: adw_free_ccb(sc, ccb); 1196 1.1 dante scsipi_done(xs); 1197 1.11 dante } 1198 1.11 dante 1199 1.11 dante 1200 1.13 dante /* 1201 1.22 dante * adw_async_callback() - Adv Library asynchronous event callback function. 1202 1.13 dante */ 1203 1.11 dante static void 1204 1.30 lukem adw_async_callback(ADW_SOFTC *sc, u_int8_t code) 1205 1.11 dante { 1206 1.13 dante switch (code) { 1207 1.13 dante case ADV_ASYNC_SCSI_BUS_RESET_DET: 1208 1.21 dante /* The firmware detected a SCSI Bus reset. */ 1209 1.54 msaitoh printf("%s: SCSI Bus reset detected\n", 1210 1.54 msaitoh device_xname(sc->sc_dev)); 1211 1.13 dante break; 1212 1.13 dante 1213 1.13 dante case ADV_ASYNC_RDMA_FAILURE: 1214 1.13 dante /* 1215 1.13 dante * Handle RDMA failure by resetting the SCSI Bus and 1216 1.19 dante * possibly the chip if it is unresponsive. 1217 1.13 dante */ 1218 1.20 dante printf("%s: RDMA failure. Resetting the SCSI Bus and" 1219 1.52 chs " the adapter\n", device_xname(sc->sc_dev)); 1220 1.22 dante AdwResetSCSIBus(sc); 1221 1.13 dante break; 1222 1.13 dante 1223 1.13 dante case ADV_HOST_SCSI_BUS_RESET: 1224 1.21 dante /* Host generated SCSI bus reset occurred. */ 1225 1.19 dante printf("%s: Host generated SCSI bus reset occurred\n", 1226 1.52 chs device_xname(sc->sc_dev)); 1227 1.19 dante break; 1228 1.19 dante 1229 1.19 dante case ADV_ASYNC_CARRIER_READY_FAILURE: 1230 1.21 dante /* Carrier Ready failure. */ 1231 1.54 msaitoh printf("%s: Carrier Ready failure!\n", 1232 1.54 msaitoh device_xname(sc->sc_dev)); 1233 1.19 dante break; 1234 1.13 dante 1235 1.13 dante default: 1236 1.13 dante break; 1237 1.13 dante } 1238 1.1 dante } 1239