1 1.72 andvar /* $NetBSD: ncr5380.c,v 1.72 2023/08/01 21:26:28 andvar Exp $ */ 2 1.1 briggs 3 1.1 briggs /* 4 1.1 briggs * Copyright (c) 1995 Leo Weppelman. 5 1.1 briggs * All rights reserved. 6 1.1 briggs * 7 1.1 briggs * Redistribution and use in source and binary forms, with or without 8 1.1 briggs * modification, are permitted provided that the following conditions 9 1.1 briggs * are met: 10 1.1 briggs * 1. Redistributions of source code must retain the above copyright 11 1.1 briggs * notice, this list of conditions and the following disclaimer. 12 1.1 briggs * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 briggs * notice, this list of conditions and the following disclaimer in the 14 1.1 briggs * documentation and/or other materials provided with the distribution. 15 1.1 briggs * 16 1.1 briggs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 briggs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 briggs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 briggs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 briggs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 briggs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 briggs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 briggs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 briggs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 briggs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 briggs */ 27 1.53 lukem 28 1.53 lukem #include <sys/cdefs.h> 29 1.72 andvar __KERNEL_RCSID(0, "$NetBSD: ncr5380.c,v 1.72 2023/08/01 21:26:28 andvar Exp $"); 30 1.1 briggs 31 1.1 briggs /* 32 1.1 briggs * Bit mask of targets you want debugging to be shown 33 1.1 briggs */ 34 1.1 briggs u_char dbg_target_mask = 0x7f; 35 1.1 briggs 36 1.1 briggs /* 37 1.1 briggs * Set bit for target when parity checking must be disabled. 38 1.1 briggs * My (LWP) Maxtor 7245S seems to generate parity errors on about 50% 39 1.1 briggs * of all transfers while the data is correct!? 40 1.1 briggs */ 41 1.1 briggs u_char ncr5380_no_parchk = 0xff; 42 1.1 briggs 43 1.14 briggs #ifdef AUTO_SENSE 44 1.14 briggs 45 1.14 briggs /* 46 1.14 briggs * Bit masks of targets that accept linked commands, and those 47 1.21 briggs * that we've already checked out. Some devices will report 48 1.21 briggs * that they support linked commands when they have problems with 49 1.21 briggs * them. By default, don't try them on any devices. Allow an 50 1.21 briggs * option to override. 51 1.14 briggs */ 52 1.14 briggs u_char ncr_will_link = 0x00; 53 1.21 briggs #ifdef TRY_SCSI_LINKED_COMMANDS 54 1.21 briggs u_char ncr_test_link = ((~TRY_SCSI_LINKED_COMMANDS) & 0x7f); 55 1.21 briggs #else 56 1.21 briggs u_char ncr_test_link = 0x7f; 57 1.21 briggs #endif 58 1.14 briggs 59 1.14 briggs #endif /* AUTO_SENSE */ 60 1.14 briggs 61 1.1 briggs /* 62 1.1 briggs * This is the default sense-command we send. 63 1.1 briggs */ 64 1.1 briggs static u_char sense_cmd[] = { 65 1.58 thorpej SCSI_REQUEST_SENSE, 0, 0, 0, sizeof(struct scsi_sense_data), 0 66 1.1 briggs }; 67 1.1 briggs 68 1.1 briggs /* 69 1.1 briggs * True if the main co-routine is running 70 1.1 briggs */ 71 1.1 briggs static volatile int main_running = 0; 72 1.1 briggs 73 1.1 briggs /* 74 1.1 briggs * Mask of targets selected 75 1.1 briggs */ 76 1.1 briggs static u_char busy; 77 1.1 briggs 78 1.57 chs static void ncr5380_minphys(struct buf *); 79 1.57 chs static void ncr5380_scsi_request(struct scsipi_channel *, 80 1.57 chs scsipi_adapter_req_t, void *); 81 1.57 chs static void ncr5380_show_scsi_cmd(struct scsipi_xfer *); 82 1.1 briggs 83 1.1 briggs static SC_REQ req_queue[NREQ]; 84 1.1 briggs static SC_REQ *free_head = NULL; /* Free request structures */ 85 1.1 briggs 86 1.1 briggs 87 1.1 briggs /* 88 1.1 briggs * Inline functions: 89 1.1 briggs */ 90 1.1 briggs 91 1.1 briggs /* 92 1.1 briggs * Wait for request-line to become active. When it doesn't return 0. 93 1.1 briggs * Otherwise return != 0. 94 1.1 briggs * The timeouts in the 'wait_req_*' functions are arbitrary and rather 95 1.1 briggs * large. In 99% of the invocations nearly no timeout is needed but in 96 1.1 briggs * some cases (especially when using my tapedrive, a Tandberg 3600) the 97 1.1 briggs * device is busy internally and the first SCSI-phase will be delayed. 98 1.31 briggs * 99 1.31 briggs * -- A sleeping Fujitsu M2512 is even worse; try 2.5 sec -hf 20 Jun 100 1.1 briggs */ 101 1.61 perry extern inline int wait_req_true(void) 102 1.1 briggs { 103 1.30 briggs int timeout = 2500000; 104 1.1 briggs 105 1.1 briggs while (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ) && --timeout) 106 1.1 briggs delay(1); 107 1.1 briggs return (GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ); 108 1.1 briggs } 109 1.1 briggs 110 1.1 briggs /* 111 1.1 briggs * Wait for request-line to become inactive. When it doesn't return 0. 112 1.1 briggs * Otherwise return != 0. 113 1.1 briggs */ 114 1.61 perry extern inline int wait_req_false(void) 115 1.1 briggs { 116 1.30 briggs int timeout = 2500000; 117 1.1 briggs 118 1.1 briggs while ((GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ) && --timeout) 119 1.1 briggs delay(1); 120 1.1 briggs return (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_REQ)); 121 1.1 briggs } 122 1.1 briggs 123 1.61 perry extern inline void ack_message(void) 124 1.3 briggs { 125 1.3 briggs SET_5380_REG(NCR5380_ICOM, 0); 126 1.3 briggs } 127 1.3 briggs 128 1.61 perry extern inline void nack_message(SC_REQ *reqp, u_char msg) 129 1.3 briggs { 130 1.3 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 131 1.9 briggs reqp->msgout = msg; 132 1.3 briggs } 133 1.3 briggs 134 1.61 perry extern inline void finish_req(SC_REQ *reqp) 135 1.1 briggs { 136 1.1 briggs int sps; 137 1.39 bouyer struct scsipi_xfer *xs = reqp->xs; 138 1.1 briggs 139 1.1 briggs #ifdef REAL_DMA 140 1.1 briggs /* 141 1.1 briggs * If we bounced, free the bounce buffer 142 1.1 briggs */ 143 1.1 briggs if (reqp->dr_flag & DRIVER_BOUNCING) 144 1.1 briggs free_bounceb(reqp->bounceb); 145 1.1 briggs #endif /* REAL_DMA */ 146 1.1 briggs #ifdef DBG_REQ 147 1.1 briggs if (dbg_target_mask & (1 << reqp->targ_id)) 148 1.1 briggs show_request(reqp, "DONE"); 149 1.1 briggs #endif 150 1.1 briggs #ifdef DBG_ERR_RET 151 1.1 briggs if (reqp->xs->error != 0) 152 1.1 briggs show_request(reqp, "ERR_RET"); 153 1.1 briggs #endif 154 1.1 briggs /* 155 1.1 briggs * Return request to free-q 156 1.1 briggs */ 157 1.1 briggs sps = splbio(); 158 1.1 briggs reqp->next = free_head; 159 1.1 briggs free_head = reqp; 160 1.1 briggs splx(sps); 161 1.1 briggs 162 1.45 thorpej xs->xs_status |= XS_STS_DONE; 163 1.14 briggs if (!(reqp->dr_flag & DRIVER_LINKCHK)) 164 1.39 bouyer scsipi_done(xs); 165 1.1 briggs } 166 1.1 briggs 167 1.1 briggs /* 168 1.1 briggs * Auto config stuff.... 169 1.1 briggs */ 170 1.65 chs void ncr_attach(device_t, device_t, void *); 171 1.65 chs int ncr_match(device_t, cfdata_t, void *); 172 1.1 briggs 173 1.1 briggs /* 174 1.1 briggs * Tricks to make driver-name configurable 175 1.1 briggs */ 176 1.23 thorpej #define CFNAME(n) __CONCAT(n,_cd) 177 1.23 thorpej #define CANAME(n) __CONCAT(n,_ca) 178 1.1 briggs #define CFSTRING(n) __STRING(n) 179 1.50 thorpej #define CFDRNAME(n) n 180 1.1 briggs 181 1.65 chs CFATTACH_DECL_NEW(CFDRNAME(DRNAME), sizeof(struct ncr_softc), 182 1.50 thorpej ncr_match, ncr_attach, NULL, NULL); 183 1.23 thorpej 184 1.40 thorpej extern struct cfdriver CFNAME(DRNAME); 185 1.1 briggs 186 1.1 briggs int 187 1.65 chs ncr_match(device_t parent, cfdata_t cf, void *aux) 188 1.1 briggs { 189 1.65 chs 190 1.38 scottr return (machine_match(parent, cf, aux, &CFNAME(DRNAME))); 191 1.1 briggs } 192 1.1 briggs 193 1.1 briggs void 194 1.65 chs ncr_attach(device_t parent, device_t self, void *aux) 195 1.1 briggs { 196 1.1 briggs struct ncr_softc *sc; 197 1.1 briggs int i; 198 1.1 briggs 199 1.65 chs sc = device_private(self); 200 1.1 briggs 201 1.65 chs sc->sc_dev = self; 202 1.65 chs sc->sc_adapter.adapt_dev = self; 203 1.47 bouyer sc->sc_adapter.adapt_openings = 7; 204 1.47 bouyer sc->sc_adapter.adapt_max_periph = 1; 205 1.47 bouyer sc->sc_adapter.adapt_ioctl = NULL; 206 1.47 bouyer sc->sc_adapter.adapt_minphys = ncr5380_minphys; 207 1.47 bouyer sc->sc_adapter.adapt_request = ncr5380_scsi_request; 208 1.47 bouyer 209 1.47 bouyer sc->sc_channel.chan_adapter = &sc->sc_adapter; 210 1.47 bouyer sc->sc_channel.chan_bustype = &scsi_bustype; 211 1.47 bouyer sc->sc_channel.chan_channel = 0; 212 1.47 bouyer sc->sc_channel.chan_ntargets = 8; 213 1.47 bouyer sc->sc_channel.chan_nluns = 8; 214 1.47 bouyer sc->sc_channel.chan_id = 7; 215 1.1 briggs 216 1.1 briggs /* 217 1.5 briggs * bitmasks 218 1.5 briggs */ 219 1.5 briggs sc->sc_noselatn = 0; 220 1.5 briggs sc->sc_selected = 0; 221 1.5 briggs 222 1.5 briggs /* 223 1.1 briggs * Initialize machine-type specific things... 224 1.1 briggs */ 225 1.1 briggs scsi_mach_init(sc); 226 1.35 christos printf("\n"); 227 1.1 briggs 228 1.1 briggs /* 229 1.1 briggs * Initialize request queue freelist. 230 1.1 briggs */ 231 1.1 briggs for (i = 0; i < NREQ; i++) { 232 1.1 briggs req_queue[i].next = free_head; 233 1.1 briggs free_head = &req_queue[i]; 234 1.1 briggs } 235 1.1 briggs 236 1.1 briggs /* 237 1.1 briggs * Initialize the host adapter 238 1.1 briggs */ 239 1.1 briggs scsi_idisable(); 240 1.1 briggs ENABLE_NCR5380(sc); 241 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 242 1.1 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 243 1.1 briggs SET_5380_REG(NCR5380_TCOM, 0); 244 1.1 briggs SET_5380_REG(NCR5380_IDSTAT, 0); 245 1.1 briggs scsi_ienable(); 246 1.1 briggs 247 1.1 briggs /* 248 1.1 briggs * attach all scsi units on us 249 1.1 briggs */ 250 1.70 thorpej config_found(self, &sc->sc_channel, scsiprint, CFARGS_NONE); 251 1.1 briggs } 252 1.1 briggs 253 1.1 briggs /* 254 1.1 briggs * End of auto config stuff.... 255 1.1 briggs */ 256 1.1 briggs 257 1.1 briggs /* 258 1.1 briggs * Carry out a request from the high level driver. 259 1.1 briggs */ 260 1.47 bouyer static void 261 1.57 chs ncr5380_scsi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req, 262 1.57 chs void *arg) 263 1.47 bouyer { 264 1.47 bouyer struct scsipi_xfer *xs; 265 1.65 chs struct ncr_softc *sc = device_private(chan->chan_adapter->adapt_dev); 266 1.55 matt int sps, flags; 267 1.14 briggs SC_REQ *reqp, *link, *tmp; 268 1.1 briggs 269 1.47 bouyer switch (req) { 270 1.47 bouyer case ADAPTER_REQ_RUN_XFER: 271 1.47 bouyer xs = arg; 272 1.55 matt flags = xs->xs_control; 273 1.47 bouyer 274 1.47 bouyer /* 275 1.47 bouyer * We do not queue RESET commands 276 1.47 bouyer */ 277 1.47 bouyer if (flags & XS_CTL_RESET) { 278 1.47 bouyer scsi_reset_verbose(sc, "Got reset-command"); 279 1.47 bouyer scsipi_done(xs); 280 1.47 bouyer return; 281 1.47 bouyer } 282 1.1 briggs 283 1.47 bouyer /* 284 1.47 bouyer * Get a request block 285 1.47 bouyer */ 286 1.47 bouyer sps = splbio(); 287 1.47 bouyer if ((reqp = free_head) == 0) { 288 1.47 bouyer xs->error = XS_RESOURCE_SHORTAGE; 289 1.47 bouyer scsipi_done(xs); 290 1.47 bouyer return; 291 1.47 bouyer } 292 1.47 bouyer free_head = reqp->next; 293 1.47 bouyer reqp->next = NULL; 294 1.1 briggs splx(sps); 295 1.1 briggs 296 1.47 bouyer /* 297 1.47 bouyer * Initialize our private fields 298 1.47 bouyer */ 299 1.47 bouyer reqp->dr_flag = (flags & XS_CTL_POLL) ? DRIVER_NOINT : 0; 300 1.47 bouyer reqp->phase = NR_PHASE; 301 1.47 bouyer reqp->msgout = MSG_NOOP; 302 1.47 bouyer reqp->status = SCSGOOD; 303 1.47 bouyer reqp->message = 0xff; 304 1.47 bouyer reqp->link = NULL; 305 1.47 bouyer reqp->xs = xs; 306 1.47 bouyer reqp->targ_id = xs->xs_periph->periph_target; 307 1.47 bouyer reqp->targ_lun = xs->xs_periph->periph_lun; 308 1.47 bouyer reqp->xdata_ptr = (u_char*)xs->data; 309 1.47 bouyer reqp->xdata_len = xs->datalen; 310 1.56 thorpej memcpy(&reqp->xcmd, xs->cmd, xs->cmdlen); 311 1.56 thorpej reqp->xcmd_len = xs->cmdlen; 312 1.47 bouyer reqp->xcmd.bytes[0] |= reqp->targ_lun << 5; 313 1.1 briggs 314 1.1 briggs #ifdef REAL_DMA 315 1.54 matt /* 316 1.54 matt * Check if DMA can be used on this request 317 1.54 matt */ 318 1.54 matt if (scsi_dmaok(reqp)) 319 1.54 matt reqp->dr_flag |= DRIVER_DMAOK; 320 1.1 briggs #endif /* REAL_DMA */ 321 1.1 briggs 322 1.54 matt /* 323 1.54 matt * Insert the command into the issue queue. Note that 324 1.54 matt * 'REQUEST SENSE' commands are inserted at the head of the 325 1.54 matt * queue since any command will clear the existing contingent 326 1.54 matt * allegience condition and the sense data is only valid while 327 1.54 matt * the condition exists. 328 1.54 matt * When possible, link the command to a previous command to 329 1.54 matt * the same target. This is not very sensible when AUTO_SENSE 330 1.54 matt * is not defined! Interrupts are disabled while we are 331 1.54 matt * fiddling with the issue-queue. 332 1.54 matt */ 333 1.54 matt sps = splbio(); 334 1.54 matt link = NULL; 335 1.58 thorpej if ((issue_q == NULL) || 336 1.58 thorpej (reqp->xcmd.opcode == SCSI_REQUEST_SENSE)) { 337 1.54 matt reqp->next = issue_q; 338 1.54 matt issue_q = reqp; 339 1.54 matt } else { 340 1.54 matt tmp = issue_q; 341 1.54 matt do { 342 1.54 matt if (!link && (tmp->targ_id == reqp->targ_id) && 343 1.54 matt !tmp->link) 344 1.54 matt link = tmp; 345 1.54 matt } while (tmp->next && (tmp = tmp->next)); 346 1.54 matt tmp->next = reqp; 347 1.1 briggs #ifdef AUTO_SENSE 348 1.54 matt if (link && (ncr_will_link & (1<<reqp->targ_id))) { 349 1.54 matt link->link = reqp; 350 1.54 matt link->xcmd.bytes[link->xs->cmdlen-2] |= 1; 351 1.54 matt } 352 1.54 matt #endif 353 1.14 briggs } 354 1.14 briggs #ifdef AUTO_SENSE 355 1.54 matt /* 356 1.54 matt * If we haven't already, check the target for link support. 357 1.54 matt * Do this by prefixing the current command with a dummy 358 1.54 matt * Request_Sense command, link the dummy to the current 359 1.54 matt * command, and insert the dummy command at the head of the 360 1.54 matt * issue queue. Set the DRIVER_LINKCHK flag so that we'll 361 1.54 matt * ignore the results of the dummy command, since we only 362 1.54 matt * care about whether it was accepted or not. 363 1.54 matt */ 364 1.54 matt if (!link && !(ncr_test_link & (1<<reqp->targ_id)) && 365 1.54 matt (tmp = free_head) && !(reqp->dr_flag & DRIVER_NOINT)) { 366 1.54 matt free_head = tmp->next; 367 1.54 matt tmp->dr_flag = 368 1.54 matt (reqp->dr_flag & ~DRIVER_DMAOK) | DRIVER_LINKCHK; 369 1.54 matt tmp->phase = NR_PHASE; 370 1.54 matt tmp->msgout = MSG_NOOP; 371 1.54 matt tmp->status = SCSGOOD; 372 1.54 matt tmp->xs = reqp->xs; 373 1.54 matt tmp->targ_id = reqp->targ_id; 374 1.54 matt tmp->targ_lun = reqp->targ_lun; 375 1.57 chs memcpy(&tmp->xcmd, sense_cmd, sizeof(sense_cmd)); 376 1.56 thorpej tmp->xcmd_len = sizeof(sense_cmd); 377 1.54 matt tmp->xdata_ptr = (u_char *)&tmp->xs->sense.scsi_sense; 378 1.54 matt tmp->xdata_len = sizeof(tmp->xs->sense.scsi_sense); 379 1.54 matt ncr_test_link |= 1<<tmp->targ_id; 380 1.54 matt tmp->link = reqp; 381 1.54 matt tmp->xcmd.bytes[sizeof(sense_cmd)-2] |= 1; 382 1.54 matt tmp->next = issue_q; 383 1.54 matt issue_q = tmp; 384 1.14 briggs #ifdef DBG_REQ 385 1.47 bouyer if (dbg_target_mask & (1 << tmp->targ_id)) 386 1.47 bouyer show_request(tmp, "LINKCHK"); 387 1.1 briggs #endif 388 1.47 bouyer } 389 1.14 briggs #endif 390 1.47 bouyer splx(sps); 391 1.1 briggs 392 1.1 briggs #ifdef DBG_REQ 393 1.47 bouyer if (dbg_target_mask & (1 << reqp->targ_id)) 394 1.58 thorpej show_request(reqp, 395 1.58 thorpej (reqp->xcmd.opcode == SCSI_REQUEST_SENSE) ? 396 1.58 thorpej "HEAD":"TAIL"); 397 1.1 briggs #endif 398 1.1 briggs 399 1.47 bouyer run_main(sc); 400 1.47 bouyer return; 401 1.47 bouyer 402 1.47 bouyer case ADAPTER_REQ_GROW_RESOURCES: 403 1.47 bouyer /* XXX Not supported. */ 404 1.47 bouyer return; 405 1.1 briggs 406 1.47 bouyer case ADAPTER_REQ_SET_XFER_MODE: 407 1.47 bouyer /* XXX Not supported. */ 408 1.47 bouyer return; 409 1.47 bouyer } 410 1.1 briggs } 411 1.1 briggs 412 1.1 briggs static void 413 1.1 briggs ncr5380_minphys(struct buf *bp) 414 1.1 briggs { 415 1.1 briggs if (bp->b_bcount > MIN_PHYS) 416 1.1 briggs bp->b_bcount = MIN_PHYS; 417 1.1 briggs minphys(bp); 418 1.1 briggs } 419 1.1 briggs #undef MIN_PHYS 420 1.1 briggs 421 1.28 briggs static void 422 1.39 bouyer ncr5380_show_scsi_cmd(struct scsipi_xfer *xs) 423 1.1 briggs { 424 1.1 briggs u_char *b = (u_char *) xs->cmd; 425 1.1 briggs int i = 0; 426 1.1 briggs 427 1.47 bouyer scsipi_printaddr(xs->xs_periph); 428 1.45 thorpej if (!(xs->xs_control & XS_CTL_RESET)) { 429 1.1 briggs while (i < xs->cmdlen) { 430 1.1 briggs if (i) 431 1.35 christos printf(","); 432 1.35 christos printf("%x",b[i++]); 433 1.1 briggs } 434 1.35 christos printf("-\n"); 435 1.1 briggs } 436 1.1 briggs else { 437 1.47 bouyer printf("-RESET-\n"); 438 1.1 briggs } 439 1.1 briggs } 440 1.1 briggs 441 1.1 briggs /* 442 1.1 briggs * The body of the driver. 443 1.1 briggs */ 444 1.1 briggs static void 445 1.57 chs scsi_main(struct ncr_softc *sc) 446 1.1 briggs { 447 1.1 briggs SC_REQ *req, *prev; 448 1.1 briggs int itype; 449 1.1 briggs int sps; 450 1.1 briggs 451 1.1 briggs /* 452 1.1 briggs * While running in the driver SCSI-interrupts are disabled. 453 1.1 briggs */ 454 1.1 briggs scsi_idisable(); 455 1.1 briggs ENABLE_NCR5380(sc); 456 1.1 briggs 457 1.1 briggs PID("scsi_main1"); 458 1.1 briggs for (;;) { 459 1.1 briggs sps = splbio(); 460 1.1 briggs if (!connected) { 461 1.1 briggs /* 462 1.1 briggs * Check if it is fair keep any exclusive access to DMA 463 1.1 briggs * claimed. If not, stop queueing new jobs so the discon_q 464 1.1 briggs * will be eventually drained and DMA can be given up. 465 1.1 briggs */ 466 1.1 briggs if (!fair_to_keep_dma()) 467 1.1 briggs goto main_exit; 468 1.1 briggs 469 1.1 briggs /* 470 1.1 briggs * Search through the issue-queue for a command 471 1.1 briggs * destined for a target that isn't busy. 472 1.1 briggs */ 473 1.1 briggs prev = NULL; 474 1.1 briggs for (req=issue_q; req != NULL; prev = req, req = req->next) { 475 1.1 briggs if (!(busy & (1 << req->targ_id))) { 476 1.1 briggs /* 477 1.1 briggs * Found one, remove it from the issue queue 478 1.1 briggs */ 479 1.1 briggs if (prev == NULL) 480 1.1 briggs issue_q = req->next; 481 1.1 briggs else prev->next = req->next; 482 1.1 briggs req->next = NULL; 483 1.1 briggs break; 484 1.1 briggs } 485 1.1 briggs } 486 1.1 briggs 487 1.1 briggs /* 488 1.1 briggs * When a request has just ended, we get here before an other 489 1.1 briggs * device detects that the bus is free and that it can 490 1.1 briggs * reconnect. The problem is that when this happens, we always 491 1.1 briggs * baffle the device because our (initiator) id is higher. This 492 1.1 briggs * can cause a sort of starvation on slow devices. So we check 493 1.1 briggs * for a pending reselection here. 494 1.1 briggs * Note that 'connected' will be non-null if the reselection 495 1.1 briggs * succeeds. 496 1.1 briggs */ 497 1.1 briggs if ((GET_5380_REG(NCR5380_IDSTAT) & (SC_S_SEL|SC_S_IO)) 498 1.1 briggs == (SC_S_SEL|SC_S_IO)){ 499 1.1 briggs if (req != NULL) { 500 1.1 briggs req->next = issue_q; 501 1.1 briggs issue_q = req; 502 1.1 briggs } 503 1.1 briggs splx(sps); 504 1.1 briggs 505 1.1 briggs reselect(sc); 506 1.1 briggs scsi_clr_ipend(); 507 1.1 briggs goto connected; 508 1.1 briggs } 509 1.1 briggs 510 1.1 briggs /* 511 1.1 briggs * The host is not connected and there is no request 512 1.1 briggs * pending, exit. 513 1.1 briggs */ 514 1.1 briggs if (req == NULL) { 515 1.1 briggs PID("scsi_main2"); 516 1.1 briggs goto main_exit; 517 1.1 briggs } 518 1.1 briggs 519 1.1 briggs /* 520 1.1 briggs * Re-enable interrupts before handling the request. 521 1.1 briggs */ 522 1.1 briggs splx(sps); 523 1.1 briggs 524 1.1 briggs #ifdef DBG_REQ 525 1.1 briggs if (dbg_target_mask & (1 << req->targ_id)) 526 1.1 briggs show_request(req, "TARGET"); 527 1.1 briggs #endif 528 1.1 briggs /* 529 1.1 briggs * We found a request. Try to connect to the target. If the 530 1.1 briggs * initiator fails arbitration, the command is put back in the 531 1.1 briggs * issue queue. 532 1.1 briggs */ 533 1.1 briggs if (scsi_select(req, 0)) { 534 1.1 briggs sps = splbio(); 535 1.1 briggs req->next = issue_q; 536 1.1 briggs issue_q = req; 537 1.1 briggs splx(sps); 538 1.1 briggs #ifdef DBG_REQ 539 1.1 briggs if (dbg_target_mask & (1 << req->targ_id)) 540 1.1 briggs ncr_tprint(req, "Select failed\n"); 541 1.1 briggs #endif 542 1.1 briggs } 543 1.1 briggs } 544 1.1 briggs else splx(sps); 545 1.1 briggs connected: 546 1.1 briggs if (connected) { 547 1.1 briggs /* 548 1.52 wiz * If the host is currently connected but a 'real-DMA' transfer 549 1.52 wiz * is in progress, the 'end-of-DMA' interrupt restarts main. 550 1.1 briggs * So quit. 551 1.1 briggs */ 552 1.1 briggs sps = splbio(); 553 1.1 briggs if (connected && (connected->dr_flag & DRIVER_IN_DMA)) { 554 1.1 briggs PID("scsi_main3"); 555 1.1 briggs goto main_exit; 556 1.1 briggs } 557 1.1 briggs splx(sps); 558 1.1 briggs 559 1.1 briggs /* 560 1.1 briggs * Let the target guide us through the bus-phases 561 1.1 briggs */ 562 1.20 briggs while (information_transfer(sc) == -1) 563 1.1 briggs ; 564 1.1 briggs } 565 1.1 briggs } 566 1.1 briggs /* NEVER TO REACH HERE */ 567 1.1 briggs panic("ncr5380-SCSI: not designed to come here"); 568 1.1 briggs 569 1.1 briggs main_exit: 570 1.1 briggs /* 571 1.1 briggs * We enter here with interrupts disabled. We are about to exit main 572 1.1 briggs * so interrupts should be re-enabled. Because interrupts are edge 573 1.1 briggs * triggered, we could already have missed the interrupt. Therefore 574 1.1 briggs * we check the IRQ-line here and re-enter when we really missed a 575 1.1 briggs * valid interrupt. 576 1.1 briggs */ 577 1.1 briggs PID("scsi_main4"); 578 1.1 briggs scsi_ienable(); 579 1.20 briggs 580 1.20 briggs /* 581 1.20 briggs * If we're not currently connected, enable reselection 582 1.20 briggs * interrupts. 583 1.20 briggs */ 584 1.20 briggs if (!connected) 585 1.20 briggs SET_5380_REG(NCR5380_IDSTAT, SC_HOST_ID); 586 1.20 briggs 587 1.20 briggs if (scsi_ipending()) { 588 1.1 briggs if ((itype = check_intr(sc)) != INTR_SPURIOUS) { 589 1.1 briggs scsi_idisable(); 590 1.1 briggs splx(sps); 591 1.1 briggs 592 1.1 briggs if (itype == INTR_RESEL) 593 1.1 briggs reselect(sc); 594 1.1 briggs #ifdef REAL_DMA 595 1.1 briggs else dma_ready(); 596 1.1 briggs #else 597 1.1 briggs else { 598 1.20 briggs if (pdma_ready()) 599 1.20 briggs goto connected; 600 1.20 briggs panic("Got DMA interrupt without DMA"); 601 1.1 briggs } 602 1.1 briggs #endif 603 1.1 briggs scsi_clr_ipend(); 604 1.1 briggs goto connected; 605 1.1 briggs } 606 1.1 briggs } 607 1.1 briggs reconsider_dma(); 608 1.1 briggs 609 1.1 briggs main_running = 0; 610 1.1 briggs splx(sps); 611 1.1 briggs PID("scsi_main5"); 612 1.1 briggs } 613 1.1 briggs 614 1.1 briggs #ifdef REAL_DMA 615 1.1 briggs /* 616 1.1 briggs * The SCSI-DMA interrupt. 617 1.1 briggs * This interrupt can only be triggered when running in non-polled DMA 618 1.1 briggs * mode. When DMA is not active, it will be silently ignored, it is usually 619 1.1 briggs * to late because the EOP interrupt of the controller happens just a tiny 620 1.64 snj * bit earlier. It might become useful when scatter/gather is implemented, 621 1.1 briggs * because in that case only part of the DATAIN/DATAOUT transfer is taken 622 1.1 briggs * out of a single buffer. 623 1.1 briggs */ 624 1.1 briggs static void 625 1.57 chs ncr_dma_intr(struct ncr_softc *sc) 626 1.1 briggs { 627 1.1 briggs SC_REQ *reqp; 628 1.1 briggs int dma_done; 629 1.1 briggs 630 1.1 briggs PID("ncr_dma_intr"); 631 1.1 briggs if ((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)) { 632 1.1 briggs scsi_idisable(); 633 1.1 briggs if (!(dma_done = dma_ready())) { 634 1.1 briggs transfer_dma(reqp, reqp->phase, 0); 635 1.1 briggs return; 636 1.1 briggs } 637 1.1 briggs run_main(sc); 638 1.1 briggs } 639 1.1 briggs } 640 1.1 briggs #endif /* REAL_DMA */ 641 1.1 briggs 642 1.1 briggs /* 643 1.1 briggs * The SCSI-controller interrupt. This interrupt occurs on reselections and 644 1.1 briggs * at the end of non-polled DMA-interrupts. It is assumed to be called from 645 1.1 briggs * the machine-dependent hardware interrupt. 646 1.1 briggs */ 647 1.1 briggs static void 648 1.57 chs ncr_ctrl_intr(struct ncr_softc *sc) 649 1.1 briggs { 650 1.1 briggs int itype; 651 1.1 briggs 652 1.20 briggs while (scsi_ipending()) { 653 1.1 briggs scsi_idisable(); 654 1.1 briggs if ((itype = check_intr(sc)) != INTR_SPURIOUS) { 655 1.1 briggs if (itype == INTR_RESEL) 656 1.1 briggs reselect(sc); 657 1.1 briggs else { 658 1.1 briggs #ifdef REAL_DMA 659 1.28 briggs int dma_done; 660 1.1 briggs if (!(dma_done = dma_ready())) { 661 1.1 briggs transfer_dma(connected, connected->phase, 0); 662 1.1 briggs return; 663 1.1 briggs } 664 1.1 briggs #else 665 1.20 briggs if (pdma_ready()) 666 1.20 briggs return; 667 1.48 provos panic("Got DMA interrupt without DMA"); 668 1.1 briggs #endif 669 1.1 briggs } 670 1.1 briggs scsi_clr_ipend(); 671 1.1 briggs } 672 1.1 briggs run_main(sc); 673 1.1 briggs return; 674 1.1 briggs } 675 1.1 briggs PID("ncr_ctrl_intr1"); 676 1.1 briggs } 677 1.1 briggs 678 1.1 briggs /* 679 1.1 briggs * Initiate a connection path between the host and the target. The function 680 1.1 briggs * first goes into arbitration for the SCSI-bus. When this succeeds, the target 681 1.1 briggs * is selected and an 'IDENTIFY' message is send. 682 1.1 briggs * Returns -1 when the arbitration failed. Otherwise 0 is returned. When 683 1.1 briggs * the target does not respond (to either selection or 'MESSAGE OUT') the 684 1.1 briggs * 'done' function is executed. 685 1.1 briggs * The result code given by the driver can be influenced by setting 'code' 686 1.1 briggs * to a non-zero value. This is the case when 'select' is called by abort. 687 1.1 briggs */ 688 1.1 briggs static int 689 1.57 chs scsi_select(SC_REQ *reqp, int code) 690 1.1 briggs { 691 1.1 briggs u_char tmp[1]; 692 1.1 briggs u_char phase; 693 1.1 briggs u_long cnt; 694 1.1 briggs int sps; 695 1.5 briggs u_int8_t atn_flag; 696 1.5 briggs u_int8_t targ_bit; 697 1.1 briggs struct ncr_softc *sc; 698 1.1 briggs 699 1.65 chs sc = device_private(reqp->xs->xs_periph->periph_channel->chan_adapter->adapt_dev); 700 1.1 briggs DBG_SELPRINT ("Starting arbitration\n", 0); 701 1.1 briggs PID("scsi_select1"); 702 1.1 briggs 703 1.1 briggs sps = splbio(); 704 1.1 briggs 705 1.1 briggs /* 706 1.72 andvar * Prevent a race condition here. If a reselection interrupt occurred 707 1.1 briggs * between the decision to pick a new request and the call to select, 708 1.1 briggs * we abort the selection. 709 1.1 briggs * Interrupts are lowered when the 5380 is setup to arbitrate for the 710 1.1 briggs * bus. 711 1.1 briggs */ 712 1.10 briggs if (connected) { 713 1.1 briggs splx(sps); 714 1.1 briggs PID("scsi_select2"); 715 1.1 briggs return (-1); 716 1.1 briggs } 717 1.1 briggs 718 1.1 briggs /* 719 1.1 briggs * Set phase bits to 0, otherwise the 5380 won't drive the bus during 720 1.1 briggs * selection. 721 1.1 briggs */ 722 1.1 briggs SET_5380_REG(NCR5380_TCOM, 0); 723 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 724 1.1 briggs 725 1.1 briggs /* 726 1.1 briggs * Arbitrate for the bus. 727 1.1 briggs */ 728 1.1 briggs SET_5380_REG(NCR5380_DATA, SC_HOST_ID); 729 1.1 briggs SET_5380_REG(NCR5380_MODE, SC_ARBIT); 730 1.1 briggs 731 1.1 briggs splx(sps); 732 1.1 briggs 733 1.10 briggs cnt = 10; 734 1.1 briggs while (!(GET_5380_REG(NCR5380_ICOM) & SC_AIP) && --cnt) 735 1.1 briggs delay(1); 736 1.1 briggs 737 1.1 briggs if (!(GET_5380_REG(NCR5380_ICOM) & SC_AIP)) { 738 1.1 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 739 1.10 briggs SET_5380_REG(NCR5380_ICOM, 0); 740 1.10 briggs DBG_SELPRINT ("Arbitration lost, bus not free\n",0); 741 1.1 briggs PID("scsi_select3"); 742 1.1 briggs return (-1); 743 1.1 briggs } 744 1.1 briggs 745 1.1 briggs /* The arbitration delay is 2.2 usecs */ 746 1.1 briggs delay(3); 747 1.1 briggs 748 1.1 briggs /* 749 1.1 briggs * Check the result of the arbitration. If we failed, return -1. 750 1.1 briggs */ 751 1.1 briggs if (GET_5380_REG(NCR5380_ICOM) & SC_LA) { 752 1.10 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 753 1.10 briggs SET_5380_REG(NCR5380_ICOM, 0); 754 1.10 briggs PID("scsi_select4"); 755 1.10 briggs return (-1); 756 1.10 briggs } 757 1.10 briggs 758 1.10 briggs /* 759 1.10 briggs * The spec requires that we should read the data register to 760 1.10 briggs * check for higher id's and check the SC_LA again. 761 1.10 briggs */ 762 1.10 briggs tmp[0] = GET_5380_REG(NCR5380_DATA); 763 1.10 briggs if (tmp[0] & ~((SC_HOST_ID << 1) - 1)) { 764 1.10 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 765 1.10 briggs SET_5380_REG(NCR5380_ICOM, 0); 766 1.10 briggs DBG_SELPRINT ("Arbitration lost, higher id present\n",0); 767 1.10 briggs PID("scsi_select5"); 768 1.10 briggs return (-1); 769 1.10 briggs } 770 1.10 briggs if (GET_5380_REG(NCR5380_ICOM) & SC_LA) { 771 1.10 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 772 1.10 briggs SET_5380_REG(NCR5380_ICOM, 0); 773 1.10 briggs DBG_SELPRINT ("Arbitration lost,deassert SC_ARBIT\n",0); 774 1.10 briggs PID("scsi_select6"); 775 1.10 briggs return (-1); 776 1.1 briggs } 777 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_SEL | SC_A_BSY); 778 1.1 briggs if (GET_5380_REG(NCR5380_ICOM) & SC_LA) { 779 1.1 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 780 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 781 1.1 briggs DBG_SELPRINT ("Arbitration lost, deassert SC_A_SEL\n", 0); 782 1.10 briggs PID("scsi_select7"); 783 1.1 briggs return (-1); 784 1.1 briggs } 785 1.1 briggs /* Bus settle delay + Bus clear delay = 1.2 usecs */ 786 1.1 briggs delay(2); 787 1.1 briggs DBG_SELPRINT ("Arbitration complete\n", 0); 788 1.1 briggs 789 1.1 briggs /* 790 1.1 briggs * Now that we won the arbitration, start the selection. 791 1.1 briggs */ 792 1.10 briggs targ_bit = 1 << reqp->targ_id; 793 1.5 briggs SET_5380_REG(NCR5380_DATA, SC_HOST_ID | targ_bit); 794 1.5 briggs 795 1.5 briggs if (sc->sc_noselatn & targ_bit) 796 1.5 briggs atn_flag = 0; 797 1.5 briggs else 798 1.5 briggs atn_flag = SC_A_ATN; 799 1.1 briggs 800 1.1 briggs /* 801 1.1 briggs * Raise ATN while SEL is true before BSY goes false from arbitration, 802 1.1 briggs * since this is the only way to guarantee that we'll get a MESSAGE OUT 803 1.1 briggs * phase immediately after the selection. 804 1.1 briggs */ 805 1.5 briggs SET_5380_REG(NCR5380_ICOM, SC_A_BSY | SC_A_SEL | atn_flag | SC_ADTB); 806 1.1 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 807 1.1 briggs 808 1.1 briggs /* 809 1.1 briggs * Turn off reselection interrupts 810 1.1 briggs */ 811 1.1 briggs SET_5380_REG(NCR5380_IDSTAT, 0); 812 1.1 briggs 813 1.1 briggs /* 814 1.1 briggs * Reset BSY. The delay following it, surpresses a glitch in the 815 1.1 briggs * 5380 which causes us to see our own BSY signal instead of that of 816 1.1 briggs * the target. 817 1.1 briggs */ 818 1.6 briggs SET_5380_REG(NCR5380_ICOM, SC_A_SEL | atn_flag | SC_ADTB); 819 1.1 briggs delay(1); 820 1.1 briggs 821 1.1 briggs /* 822 1.1 briggs * Wait for the target to react, the specs call for a timeout of 823 1.1 briggs * 250 ms. 824 1.1 briggs */ 825 1.10 briggs cnt = 25000; 826 1.1 briggs while (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY) && --cnt) 827 1.1 briggs delay(10); 828 1.1 briggs 829 1.1 briggs if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) { 830 1.1 briggs /* 831 1.1 briggs * There is no reaction from the target, start the selection 832 1.1 briggs * timeout procedure. We release the databus but keep SEL 833 1.1 briggs * asserted. After that we wait a 'selection abort time' (200 834 1.1 briggs * usecs) and 2 deskew delays (90 ns) and check BSY again. 835 1.1 briggs * When BSY is asserted, we assume the selection succeeded, 836 1.1 briggs * otherwise we release the bus. 837 1.1 briggs */ 838 1.10 briggs SET_5380_REG(NCR5380_ICOM, SC_A_SEL | atn_flag); 839 1.1 briggs delay(201); 840 1.1 briggs if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) { 841 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 842 1.1 briggs reqp->xs->error = code ? code : XS_SELTIMEOUT; 843 1.1 briggs DBG_SELPRINT ("Target %d not responding to sel\n", 844 1.1 briggs reqp->targ_id); 845 1.14 briggs if (reqp->dr_flag & DRIVER_LINKCHK) 846 1.14 briggs ncr_test_link &= ~(1<<reqp->targ_id); 847 1.1 briggs finish_req(reqp); 848 1.10 briggs PID("scsi_select8"); 849 1.1 briggs return (0); 850 1.1 briggs } 851 1.1 briggs } 852 1.6 briggs SET_5380_REG(NCR5380_ICOM, atn_flag); 853 1.1 briggs 854 1.1 briggs DBG_SELPRINT ("Target %d responding to select.\n", reqp->targ_id); 855 1.1 briggs 856 1.1 briggs /* 857 1.1 briggs * The SCSI-interrupts are disabled while a request is being handled. 858 1.1 briggs */ 859 1.1 briggs scsi_idisable(); 860 1.1 briggs 861 1.1 briggs /* 862 1.5 briggs * If we did not request ATN, then don't try to send IDENTIFY. 863 1.5 briggs */ 864 1.5 briggs if (atn_flag == 0) { 865 1.5 briggs reqp->phase = PH_CMD; 866 1.5 briggs goto identify_failed; 867 1.5 briggs } 868 1.5 briggs 869 1.5 briggs /* 870 1.5 briggs * Here we prepare to send an 'IDENTIFY' message. 871 1.62 wiz * Allow disconnect only when interrupts are allowed. 872 1.5 briggs */ 873 1.5 briggs tmp[0] = MSG_IDENTIFY(reqp->targ_lun, 874 1.5 briggs (reqp->dr_flag & DRIVER_NOINT) ? 0 : 1); 875 1.5 briggs cnt = 1; 876 1.5 briggs phase = PH_MSGOUT; 877 1.7 briggs 878 1.5 briggs /* 879 1.1 briggs * Since we followed the SCSI-spec and raised ATN while SEL was true 880 1.1 briggs * but before BSY was false during the selection, a 'MESSAGE OUT' 881 1.4 briggs * phase should follow. Unfortunately, this does not happen on 882 1.4 briggs * all targets (Asante ethernet devices, for example), so we must 883 1.5 briggs * check the actual mode if the message transfer fails--if the 884 1.5 briggs * new phase is PH_CMD and has never been successfully selected 885 1.5 briggs * w/ATN in the past, then we assume that it is an old device 886 1.5 briggs * that doesn't support select w/ATN. 887 1.4 briggs */ 888 1.5 briggs if (transfer_pio(&phase, tmp, &cnt, 0) || cnt) { 889 1.4 briggs 890 1.5 briggs if ((phase == PH_CMD) && !(sc->sc_selected & targ_bit)) { 891 1.5 briggs DBG_SELPRINT ("Target %d: not responding to ATN.\n", 892 1.5 briggs reqp->targ_id); 893 1.5 briggs sc->sc_noselatn |= targ_bit; 894 1.5 briggs reqp->phase = PH_CMD; 895 1.5 briggs goto identify_failed; 896 1.5 briggs } 897 1.5 briggs 898 1.5 briggs DBG_SELPRINT ("Target %d: failed to send identify\n", 899 1.5 briggs reqp->targ_id); 900 1.5 briggs /* 901 1.5 briggs * Try to disconnect from the target. We cannot leave 902 1.5 briggs * it just hanging here. 903 1.5 briggs */ 904 1.56 thorpej if (!reach_msg_out(sc, sizeof(struct scsipi_generic))) { 905 1.5 briggs u_long len = 1; 906 1.59 jmc u_char tphase = PH_MSGOUT; 907 1.5 briggs u_char msg = MSG_ABORT; 908 1.4 briggs 909 1.59 jmc transfer_pio(&tphase, &msg, &len, 0); 910 1.1 briggs } 911 1.20 briggs else scsi_reset_verbose(sc, "Connected to unidentified target"); 912 1.5 briggs 913 1.5 briggs SET_5380_REG(NCR5380_ICOM, 0); 914 1.5 briggs reqp->xs->error = code ? code : XS_DRIVER_STUFFUP; 915 1.5 briggs finish_req(reqp); 916 1.10 briggs PID("scsi_select9"); 917 1.5 briggs return (0); 918 1.1 briggs } 919 1.5 briggs reqp->phase = PH_MSGOUT; 920 1.5 briggs 921 1.5 briggs identify_failed: 922 1.5 briggs sc->sc_selected |= targ_bit; 923 1.1 briggs 924 1.1 briggs #ifdef notyet /* LWP: Do we need timeouts in the driver? */ 925 1.1 briggs /* 926 1.1 briggs * Command is connected, start timer ticking. 927 1.1 briggs */ 928 1.1 briggs ccb_p->xtimeout = ccb_p->timeout + Lbolt; 929 1.1 briggs #endif 930 1.1 briggs 931 1.1 briggs connected = reqp; 932 1.5 briggs busy |= targ_bit; 933 1.10 briggs PID("scsi_select10"); 934 1.1 briggs return (0); 935 1.1 briggs } 936 1.1 briggs 937 1.1 briggs /* 938 1.1 briggs * Return codes: 939 1.20 briggs * 0: Job has finished or disconnected, find something else 940 1.20 briggs * -1: keep on calling information_transfer() from scsi_main() 941 1.1 briggs */ 942 1.1 briggs static int 943 1.57 chs information_transfer(struct ncr_softc *sc) 944 1.1 briggs { 945 1.1 briggs SC_REQ *reqp = connected; 946 1.1 briggs u_char tmp, phase; 947 1.1 briggs u_long len; 948 1.1 briggs 949 1.1 briggs PID("info_transf1"); 950 1.1 briggs /* 951 1.1 briggs * Clear pending interrupts from 5380-chip. 952 1.1 briggs */ 953 1.1 briggs scsi_clr_ipend(); 954 1.1 briggs 955 1.1 briggs /* 956 1.20 briggs * The SCSI-spec requires BSY to be true while connected to a target, 957 1.20 briggs * loosing it means we lost the target... 958 1.20 briggs * Also REQ needs to be asserted here to indicate that the bus-phase 959 1.20 briggs * is valid. When the target does not supply REQ within a 'reasonable' 960 1.67 snj * amount of time, it's probably lost in its own maze of twisting 961 1.20 briggs * passages, we have to reset the bus to free it. 962 1.1 briggs */ 963 1.20 briggs if (GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY) 964 1.20 briggs wait_req_true(); 965 1.1 briggs tmp = GET_5380_REG(NCR5380_IDSTAT); 966 1.1 briggs 967 1.20 briggs 968 1.20 briggs if ((tmp & (SC_S_BSY|SC_S_REQ)) != (SC_S_BSY|SC_S_REQ)) { 969 1.1 briggs busy &= ~(1 << reqp->targ_id); 970 1.1 briggs connected = NULL; 971 1.20 briggs reqp->xs->error = XS_TIMEOUT; 972 1.1 briggs finish_req(reqp); 973 1.20 briggs if (!(tmp & SC_S_REQ)) 974 1.20 briggs scsi_reset_verbose(sc, 975 1.20 briggs "Timeout waiting for phase-change"); 976 1.1 briggs PID("info_transf2"); 977 1.1 briggs return (0); 978 1.1 briggs } 979 1.1 briggs 980 1.20 briggs phase = (tmp >> 2) & 7; 981 1.20 briggs if (phase != reqp->phase) { 982 1.20 briggs reqp->phase = phase; 983 1.20 briggs DBG_INFPRINT(show_phase, reqp, phase); 984 1.1 briggs } 985 1.27 briggs else { 986 1.27 briggs /* 987 1.27 briggs * Same data-phase. If same error give up 988 1.27 briggs */ 989 1.27 briggs if ((reqp->msgout == MSG_ABORT) 990 1.27 briggs && ((phase == PH_DATAOUT) || (phase == PH_DATAIN))) { 991 1.27 briggs busy &= ~(1 << reqp->targ_id); 992 1.27 briggs connected = NULL; 993 1.27 briggs finish_req(reqp); 994 1.27 briggs scsi_reset_verbose(sc, "Failure to abort command"); 995 1.27 briggs return (0); 996 1.27 briggs } 997 1.27 briggs } 998 1.1 briggs 999 1.1 briggs switch (phase) { 1000 1.1 briggs case PH_DATAOUT: 1001 1.1 briggs #ifdef DBG_NOWRITE 1002 1.1 briggs ncr_tprint(reqp, "NOWRITE set -- write attempt aborted."); 1003 1.1 briggs reqp->msgout = MSG_ABORT; 1004 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 1005 1.1 briggs return (-1); 1006 1.1 briggs #endif /* DBG_NOWRITE */ 1007 1.1 briggs /* 1008 1.1 briggs * If this is the first write using DMA, fill 1009 1.1 briggs * the bounce buffer. 1010 1.1 briggs */ 1011 1.1 briggs if (reqp->xdata_ptr == reqp->xs->data) { /* XXX */ 1012 1.1 briggs if (reqp->dr_flag & DRIVER_BOUNCING) 1013 1.57 chs memcpy(reqp->bounceb, reqp->xdata_ptr, reqp->xdata_len); 1014 1.1 briggs } 1015 1.1 briggs 1016 1.1 briggs case PH_DATAIN: 1017 1.27 briggs if (reqp->xdata_len <= 0) { 1018 1.27 briggs /* 1019 1.27 briggs * Target keeps requesting data. Try to get into 1020 1.27 briggs * message-out phase by feeding/taking 100 byte. 1021 1.27 briggs */ 1022 1.27 briggs ncr_tprint(reqp, "Target requests too much data\n"); 1023 1.27 briggs reqp->msgout = MSG_ABORT; 1024 1.27 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 1025 1.27 briggs reach_msg_out(sc, 100); 1026 1.27 briggs return (-1); 1027 1.27 briggs } 1028 1.1 briggs #ifdef REAL_DMA 1029 1.1 briggs if (reqp->dr_flag & DRIVER_DMAOK) { 1030 1.1 briggs int poll = REAL_DMA_POLL|(reqp->dr_flag & DRIVER_NOINT); 1031 1.1 briggs transfer_dma(reqp, phase, poll); 1032 1.1 briggs if (!poll) 1033 1.1 briggs return (0); 1034 1.1 briggs } 1035 1.1 briggs else 1036 1.1 briggs #endif 1037 1.1 briggs { 1038 1.1 briggs PID("info_transf3"); 1039 1.1 briggs len = reqp->xdata_len; 1040 1.1 briggs #ifdef USE_PDMA 1041 1.1 briggs if (transfer_pdma(&phase, reqp->xdata_ptr, &len) == 0) 1042 1.7 briggs return (0); 1043 1.1 briggs #else 1044 1.3 briggs transfer_pio(&phase, reqp->xdata_ptr, &len, 0); 1045 1.1 briggs #endif 1046 1.1 briggs reqp->xdata_ptr += reqp->xdata_len - len; 1047 1.1 briggs reqp->xdata_len = len; 1048 1.1 briggs } 1049 1.1 briggs return (-1); 1050 1.1 briggs case PH_MSGIN: 1051 1.1 briggs /* 1052 1.1 briggs * We only expect single byte messages here. 1053 1.1 briggs */ 1054 1.1 briggs len = 1; 1055 1.3 briggs transfer_pio(&phase, &tmp, &len, 1); 1056 1.1 briggs reqp->message = tmp; 1057 1.1 briggs return (handle_message(reqp, tmp)); 1058 1.1 briggs case PH_MSGOUT: 1059 1.1 briggs len = 1; 1060 1.3 briggs transfer_pio(&phase, &reqp->msgout, &len, 0); 1061 1.1 briggs if (reqp->msgout == MSG_ABORT) { 1062 1.1 briggs busy &= ~(1 << reqp->targ_id); 1063 1.1 briggs connected = NULL; 1064 1.27 briggs if (!reqp->xs->error) 1065 1.27 briggs reqp->xs->error = XS_DRIVER_STUFFUP; 1066 1.1 briggs finish_req(reqp); 1067 1.1 briggs PID("info_transf4"); 1068 1.1 briggs return (0); 1069 1.1 briggs } 1070 1.1 briggs reqp->msgout = MSG_NOOP; 1071 1.1 briggs return (-1); 1072 1.1 briggs case PH_CMD : 1073 1.56 thorpej len = reqp->xcmd_len; 1074 1.3 briggs transfer_pio(&phase, (u_char *)&reqp->xcmd, &len, 0); 1075 1.1 briggs PID("info_transf5"); 1076 1.1 briggs return (-1); 1077 1.1 briggs case PH_STATUS: 1078 1.1 briggs len = 1; 1079 1.3 briggs transfer_pio(&phase, &tmp, &len, 0); 1080 1.1 briggs reqp->status = tmp; 1081 1.1 briggs PID("info_transf6"); 1082 1.1 briggs return (-1); 1083 1.1 briggs default : 1084 1.1 briggs ncr_tprint(reqp, "Unknown phase\n"); 1085 1.1 briggs } 1086 1.1 briggs PID("info_transf7"); 1087 1.1 briggs return (-1); 1088 1.1 briggs } 1089 1.1 briggs 1090 1.1 briggs /* 1091 1.1 briggs * Handle the message 'msg' send to us by the target. 1092 1.1 briggs * Return values: 1093 1.1 briggs * 0 : The current command has completed. 1094 1.1 briggs * -1 : Get on to the next phase. 1095 1.1 briggs */ 1096 1.1 briggs static int 1097 1.57 chs handle_message(SC_REQ *reqp, u_int msg) 1098 1.1 briggs { 1099 1.1 briggs int sps; 1100 1.11 briggs SC_REQ *prev, *req; 1101 1.1 briggs 1102 1.1 briggs PID("hmessage1"); 1103 1.1 briggs switch (msg) { 1104 1.1 briggs /* 1105 1.1 briggs * Linking lets us reduce the time required to get 1106 1.1 briggs * the next command to the device, skipping the arbitration 1107 1.1 briggs * and selection time. In the current implementation, 1108 1.1 briggs * we merely have to start the next command pointed 1109 1.1 briggs * to by 'next_link'. 1110 1.1 briggs */ 1111 1.1 briggs case MSG_LINK_CMD_COMPLETE: 1112 1.1 briggs case MSG_LINK_CMD_COMPLETEF: 1113 1.1 briggs if (reqp->link == NULL) { 1114 1.1 briggs ncr_tprint(reqp, "No link for linked command"); 1115 1.9 briggs nack_message(reqp, MSG_ABORT); 1116 1.1 briggs PID("hmessage2"); 1117 1.1 briggs return (-1); 1118 1.1 briggs } 1119 1.3 briggs ack_message(); 1120 1.11 briggs if (!(reqp->dr_flag & DRIVER_AUTOSEN)) { 1121 1.11 briggs reqp->xs->resid = reqp->xdata_len; 1122 1.11 briggs reqp->xs->error = 0; 1123 1.11 briggs } 1124 1.1 briggs 1125 1.1 briggs #ifdef AUTO_SENSE 1126 1.11 briggs if (check_autosense(reqp, 1) == -1) 1127 1.1 briggs return (-1); 1128 1.1 briggs #endif /* AUTO_SENSE */ 1129 1.1 briggs 1130 1.1 briggs #ifdef DBG_REQ 1131 1.1 briggs if (dbg_target_mask & (1 << reqp->targ_id)) 1132 1.1 briggs show_request(reqp->link, "LINK"); 1133 1.1 briggs #endif 1134 1.1 briggs connected = reqp->link; 1135 1.11 briggs 1136 1.11 briggs /* 1137 1.11 briggs * Unlink the 'linked' request from the issue_q 1138 1.11 briggs */ 1139 1.11 briggs sps = splbio(); 1140 1.11 briggs prev = NULL; 1141 1.11 briggs req = issue_q; 1142 1.11 briggs for (; req != NULL; prev = req, req = req->next) { 1143 1.11 briggs if (req == connected) 1144 1.11 briggs break; 1145 1.11 briggs } 1146 1.11 briggs if (req == NULL) 1147 1.11 briggs panic("Inconsistent issue_q"); 1148 1.11 briggs if (prev == NULL) 1149 1.11 briggs issue_q = req->next; 1150 1.11 briggs else prev->next = req->next; 1151 1.11 briggs req->next = NULL; 1152 1.11 briggs splx(sps); 1153 1.11 briggs 1154 1.1 briggs finish_req(reqp); 1155 1.1 briggs PID("hmessage3"); 1156 1.1 briggs return (-1); 1157 1.1 briggs case MSG_ABORT: 1158 1.1 briggs case MSG_CMDCOMPLETE: 1159 1.3 briggs ack_message(); 1160 1.1 briggs connected = NULL; 1161 1.1 briggs busy &= ~(1 << reqp->targ_id); 1162 1.1 briggs if (!(reqp->dr_flag & DRIVER_AUTOSEN)) { 1163 1.1 briggs reqp->xs->resid = reqp->xdata_len; 1164 1.1 briggs reqp->xs->error = 0; 1165 1.1 briggs } 1166 1.1 briggs 1167 1.1 briggs #ifdef AUTO_SENSE 1168 1.1 briggs if (check_autosense(reqp, 0) == -1) { 1169 1.1 briggs PID("hmessage4"); 1170 1.1 briggs return (0); 1171 1.1 briggs } 1172 1.1 briggs #endif /* AUTO_SENSE */ 1173 1.1 briggs 1174 1.1 briggs finish_req(reqp); 1175 1.1 briggs PID("hmessage5"); 1176 1.1 briggs return (0); 1177 1.1 briggs case MSG_MESSAGE_REJECT: 1178 1.3 briggs ack_message(); 1179 1.1 briggs PID("hmessage6"); 1180 1.1 briggs return (-1); 1181 1.1 briggs case MSG_DISCONNECT: 1182 1.3 briggs ack_message(); 1183 1.1 briggs #ifdef DBG_REQ 1184 1.1 briggs if (dbg_target_mask & (1 << reqp->targ_id)) 1185 1.1 briggs show_request(reqp, "DISCON"); 1186 1.1 briggs #endif 1187 1.1 briggs sps = splbio(); 1188 1.1 briggs connected = NULL; 1189 1.1 briggs reqp->next = discon_q; 1190 1.1 briggs discon_q = reqp; 1191 1.1 briggs splx(sps); 1192 1.1 briggs PID("hmessage7"); 1193 1.1 briggs return (0); 1194 1.1 briggs case MSG_SAVEDATAPOINTER: 1195 1.1 briggs case MSG_RESTOREPOINTERS: 1196 1.1 briggs /* 1197 1.68 msaitoh * We save pointers implicitly at disconnect. 1198 1.1 briggs * So we can ignore these messages. 1199 1.1 briggs */ 1200 1.3 briggs ack_message(); 1201 1.1 briggs PID("hmessage8"); 1202 1.1 briggs return (-1); 1203 1.3 briggs case MSG_EXTENDED: 1204 1.9 briggs nack_message(reqp, MSG_MESSAGE_REJECT); 1205 1.3 briggs PID("hmessage9"); 1206 1.3 briggs return (-1); 1207 1.1 briggs default: 1208 1.22 briggs if ((msg & 0x80) && !(msg & 0x18)) { /* IDENTIFY */ 1209 1.21 briggs PID("hmessage10"); 1210 1.21 briggs ack_message(); 1211 1.21 briggs return (0); 1212 1.21 briggs } else { 1213 1.21 briggs ncr_tprint(reqp, 1214 1.21 briggs "Unknown message %x. Rejecting.\n", 1215 1.21 briggs msg); 1216 1.21 briggs nack_message(reqp, MSG_MESSAGE_REJECT); 1217 1.21 briggs } 1218 1.1 briggs return (-1); 1219 1.1 briggs } 1220 1.21 briggs PID("hmessage11"); 1221 1.1 briggs return (-1); 1222 1.1 briggs } 1223 1.1 briggs 1224 1.1 briggs /* 1225 1.1 briggs * Handle reselection. If a valid reconnection occurs, connected 1226 1.1 briggs * points at the reconnected command. The command is removed from the 1227 1.1 briggs * disconnected queue. 1228 1.1 briggs */ 1229 1.1 briggs static void 1230 1.57 chs reselect(struct ncr_softc *sc) 1231 1.1 briggs { 1232 1.1 briggs u_char phase; 1233 1.1 briggs u_long len; 1234 1.1 briggs u_char msg; 1235 1.1 briggs u_char target_mask; 1236 1.1 briggs int abort = 0; 1237 1.1 briggs SC_REQ *tmp, *prev; 1238 1.1 briggs 1239 1.1 briggs PID("reselect1"); 1240 1.1 briggs target_mask = GET_5380_REG(NCR5380_DATA) & ~SC_HOST_ID; 1241 1.1 briggs 1242 1.1 briggs /* 1243 1.1 briggs * At this point, we have detected that our SCSI-id is on the bus, 1244 1.1 briggs * SEL is true and BSY was false for at least one bus settle 1245 1.1 briggs * delay (400 ns.). 1246 1.1 briggs * We must assert BSY ourselves, until the target drops the SEL signal. 1247 1.3 briggs * The SCSI-spec specifies no maximum time for this, so we have to 1248 1.3 briggs * choose something long enough to suit all targets. 1249 1.1 briggs */ 1250 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_BSY); 1251 1.11 briggs len = 250000; 1252 1.2 briggs while ((GET_5380_REG(NCR5380_IDSTAT) & SC_S_SEL) && (len > 0)) { 1253 1.2 briggs delay(1); 1254 1.2 briggs len--; 1255 1.2 briggs } 1256 1.2 briggs if (GET_5380_REG(NCR5380_IDSTAT) & SC_S_SEL) { 1257 1.2 briggs /* Damn SEL isn't dropping */ 1258 1.20 briggs scsi_reset_verbose(sc, "Target won't drop SEL during Reselect"); 1259 1.2 briggs return; 1260 1.2 briggs } 1261 1.7 briggs 1262 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 1263 1.1 briggs 1264 1.1 briggs /* 1265 1.11 briggs * Check if the reselection is still valid. Check twice because 1266 1.11 briggs * of possible line glitches - cheaper than delay(1) and we need 1267 1.11 briggs * only a few nanoseconds. 1268 1.11 briggs */ 1269 1.11 briggs if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) { 1270 1.11 briggs if (!(GET_5380_REG(NCR5380_IDSTAT) & SC_S_BSY)) { 1271 1.11 briggs ncr_aprint(sc, "Stepped into the reselection timeout\n"); 1272 1.11 briggs return; 1273 1.11 briggs } 1274 1.11 briggs } 1275 1.11 briggs 1276 1.11 briggs /* 1277 1.1 briggs * Get the expected identify message. 1278 1.1 briggs */ 1279 1.1 briggs phase = PH_MSGIN; 1280 1.1 briggs len = 1; 1281 1.3 briggs transfer_pio(&phase, &msg, &len, 0); 1282 1.1 briggs if (len || !MSG_ISIDENTIFY(msg)) { 1283 1.1 briggs ncr_aprint(sc, "Expecting IDENTIFY, got 0x%x\n", msg); 1284 1.1 briggs abort = 1; 1285 1.27 briggs tmp = NULL; 1286 1.1 briggs } 1287 1.1 briggs else { 1288 1.1 briggs /* 1289 1.1 briggs * Find the command reconnecting 1290 1.1 briggs */ 1291 1.1 briggs for (tmp = discon_q, prev = NULL; tmp; prev = tmp, tmp = tmp->next){ 1292 1.1 briggs if (target_mask == (1 << tmp->targ_id)) { 1293 1.1 briggs if (prev) 1294 1.1 briggs prev->next = tmp->next; 1295 1.1 briggs else discon_q = tmp->next; 1296 1.1 briggs tmp->next = NULL; 1297 1.1 briggs break; 1298 1.1 briggs } 1299 1.1 briggs } 1300 1.1 briggs if (tmp == NULL) { 1301 1.1 briggs ncr_aprint(sc, "No disconnected job for targetmask %x\n", 1302 1.1 briggs target_mask); 1303 1.1 briggs abort = 1; 1304 1.1 briggs } 1305 1.1 briggs } 1306 1.1 briggs if (abort) { 1307 1.1 briggs msg = MSG_ABORT; 1308 1.1 briggs len = 1; 1309 1.1 briggs phase = PH_MSGOUT; 1310 1.1 briggs 1311 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 1312 1.16 briggs if (transfer_pio(&phase, &msg, &len, 0) || len) 1313 1.20 briggs scsi_reset_verbose(sc, "Failure to abort reselection"); 1314 1.1 briggs } 1315 1.1 briggs else { 1316 1.1 briggs connected = tmp; 1317 1.1 briggs #ifdef DBG_REQ 1318 1.1 briggs if (dbg_target_mask & (1 << tmp->targ_id)) 1319 1.1 briggs show_request(tmp, "RECON"); 1320 1.1 briggs #endif 1321 1.1 briggs } 1322 1.1 briggs PID("reselect2"); 1323 1.1 briggs } 1324 1.1 briggs 1325 1.1 briggs /* 1326 1.1 briggs * Transfer data in a given phase using programmed I/O. 1327 1.1 briggs * Returns -1 when a different phase is entered without transferring the 1328 1.3 briggs * maximum number of bytes, 0 if all bytes transferred or exit is in the same 1329 1.1 briggs * phase. 1330 1.1 briggs */ 1331 1.1 briggs static int 1332 1.57 chs transfer_pio(u_char *phase, u_char *data, u_long *len, int dont_drop_ack) 1333 1.1 briggs { 1334 1.1 briggs u_int cnt = *len; 1335 1.1 briggs u_char ph = *phase; 1336 1.3 briggs u_char tmp, new_icom; 1337 1.1 briggs 1338 1.1 briggs DBG_PIOPRINT ("SCSI: transfer_pio start: phase: %d, len: %d\n", ph,cnt); 1339 1.1 briggs PID("tpio1"); 1340 1.1 briggs SET_5380_REG(NCR5380_TCOM, ph); 1341 1.1 briggs do { 1342 1.1 briggs if (!wait_req_true()) { 1343 1.1 briggs DBG_PIOPRINT ("SCSI: transfer_pio: missing REQ\n", 0, 0); 1344 1.1 briggs break; 1345 1.1 briggs } 1346 1.1 briggs if (((GET_5380_REG(NCR5380_IDSTAT) >> 2) & 7) != ph) { 1347 1.1 briggs DBG_PIOPRINT ("SCSI: transfer_pio: phase mismatch\n", 0, 0); 1348 1.1 briggs break; 1349 1.1 briggs } 1350 1.1 briggs if (PH_IN(ph)) { 1351 1.1 briggs *data++ = GET_5380_REG(NCR5380_DATA); 1352 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ACK); 1353 1.3 briggs if ((cnt == 1) && dont_drop_ack) 1354 1.3 briggs new_icom = SC_A_ACK; 1355 1.3 briggs else new_icom = 0; 1356 1.1 briggs } 1357 1.1 briggs else { 1358 1.1 briggs SET_5380_REG(NCR5380_DATA, *data++); 1359 1.1 briggs 1360 1.1 briggs /* 1361 1.1 briggs * The SCSI-standard suggests that in the 'MESSAGE OUT' phase, 1362 1.1 briggs * the initiator should drop ATN on the last byte of the 1363 1.1 briggs * message phase after REQ has been asserted for the handshake 1364 1.1 briggs * but before the initiator raises ACK. 1365 1.1 briggs */ 1366 1.1 briggs if (!( (ph == PH_MSGOUT) && (cnt > 1) )) { 1367 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_ADTB); 1368 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_ADTB | SC_A_ACK); 1369 1.3 briggs new_icom = 0; 1370 1.1 briggs } 1371 1.1 briggs else { 1372 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_ADTB | SC_A_ATN); 1373 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_ADTB|SC_A_ATN|SC_A_ACK); 1374 1.3 briggs new_icom = SC_A_ATN; 1375 1.1 briggs } 1376 1.1 briggs } 1377 1.1 briggs if (!wait_req_false()) { 1378 1.1 briggs DBG_PIOPRINT ("SCSI: transfer_pio - REQ not dropping\n", 0, 0); 1379 1.1 briggs break; 1380 1.1 briggs } 1381 1.3 briggs SET_5380_REG(NCR5380_ICOM, new_icom); 1382 1.1 briggs 1383 1.1 briggs } while (--cnt); 1384 1.1 briggs 1385 1.1 briggs if ((tmp = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ) 1386 1.1 briggs *phase = (tmp >> 2) & 7; 1387 1.1 briggs else *phase = NR_PHASE; 1388 1.1 briggs *len = cnt; 1389 1.1 briggs DBG_PIOPRINT ("SCSI: transfer_pio done: phase: %d, len: %d\n", 1390 1.1 briggs *phase, cnt); 1391 1.1 briggs PID("tpio2"); 1392 1.1 briggs if (!cnt || (*phase == ph)) 1393 1.1 briggs return (0); 1394 1.1 briggs return (-1); 1395 1.1 briggs } 1396 1.1 briggs 1397 1.1 briggs #ifdef REAL_DMA 1398 1.1 briggs /* 1399 1.1 briggs * Start a DMA-transfer on the device using the current pointers. 1400 1.1 briggs * If 'poll' is true, the function busy-waits until DMA has completed. 1401 1.1 briggs */ 1402 1.1 briggs static void 1403 1.57 chs transfer_dma(SC_REQ *reqp, u_int phase, int poll) 1404 1.1 briggs { 1405 1.1 briggs int dma_done; 1406 1.1 briggs u_char mbase = 0; 1407 1.1 briggs int sps; 1408 1.1 briggs 1409 1.1 briggs again: 1410 1.1 briggs PID("tdma1"); 1411 1.1 briggs 1412 1.1 briggs /* 1413 1.1 briggs * We should be in phase, otherwise we are not allowed to 1414 1.1 briggs * drive the bus. 1415 1.1 briggs */ 1416 1.1 briggs SET_5380_REG(NCR5380_TCOM, phase); 1417 1.1 briggs 1418 1.1 briggs /* 1419 1.1 briggs * Defer interrupts until DMA is fully running. 1420 1.1 briggs */ 1421 1.1 briggs sps = splbio(); 1422 1.1 briggs 1423 1.1 briggs /* 1424 1.1 briggs * Clear pending interrupts and parity errors. 1425 1.1 briggs */ 1426 1.1 briggs scsi_clr_ipend(); 1427 1.1 briggs 1428 1.1 briggs if (!poll) { 1429 1.1 briggs /* 1430 1.1 briggs * Enable SCSI interrupts and set IN_DMA flag, set 'mbase' 1431 1.1 briggs * to the interrupts we want enabled. 1432 1.1 briggs */ 1433 1.1 briggs scsi_ienable(); 1434 1.1 briggs reqp->dr_flag |= DRIVER_IN_DMA; 1435 1.1 briggs mbase = SC_E_EOPI | SC_MON_BSY; 1436 1.1 briggs } 1437 1.1 briggs else scsi_idisable(); 1438 1.1 briggs mbase |= IMODE_BASE | SC_M_DMA; 1439 1.1 briggs scsi_dma_setup(reqp, phase, mbase); 1440 1.1 briggs 1441 1.1 briggs splx(sps); 1442 1.1 briggs 1443 1.1 briggs if (poll) { 1444 1.1 briggs /* 1445 1.52 wiz * On polled-DMA transfers, we wait here until the 1446 1.52 wiz * 'end-of-DMA' condition occurs. 1447 1.1 briggs */ 1448 1.1 briggs poll_edma(reqp); 1449 1.1 briggs if (!(dma_done = dma_ready())) 1450 1.1 briggs goto again; 1451 1.1 briggs } 1452 1.1 briggs PID("tdma2"); 1453 1.1 briggs } 1454 1.1 briggs 1455 1.1 briggs /* 1456 1.1 briggs * Check results of a DMA data-transfer. 1457 1.1 briggs */ 1458 1.1 briggs static int 1459 1.57 chs dma_ready(void) 1460 1.1 briggs { 1461 1.1 briggs SC_REQ *reqp = connected; 1462 1.1 briggs int dmstat, is_edma; 1463 1.1 briggs long bytes_left, bytes_done; 1464 1.1 briggs 1465 1.1 briggs is_edma = get_dma_result(reqp, &bytes_left); 1466 1.1 briggs dmstat = GET_5380_REG(NCR5380_DMSTAT); 1467 1.1 briggs 1468 1.1 briggs /* 1469 1.1 briggs * Check if the call is sensible and not caused by any spurious 1470 1.1 briggs * interrupt. 1471 1.1 briggs */ 1472 1.1 briggs if (!is_edma && !(dmstat & (SC_END_DMA|SC_BSY_ERR)) 1473 1.1 briggs && (dmstat & SC_PHS_MTCH) ) { 1474 1.17 briggs ncr_tprint(reqp, "dma_ready: spurious call " 1475 1.1 briggs "(dm:%x,last_hit: %s)\n", 1476 1.1 briggs #ifdef DBG_PID 1477 1.17 briggs dmstat, last_hit[DBG_PID-1]); 1478 1.1 briggs #else 1479 1.17 briggs dmstat, "unknown"); 1480 1.1 briggs #endif 1481 1.1 briggs return (0); 1482 1.1 briggs } 1483 1.1 briggs 1484 1.1 briggs /* 1485 1.1 briggs * Clear all (pending) interrupts. 1486 1.1 briggs */ 1487 1.1 briggs scsi_clr_ipend(); 1488 1.1 briggs 1489 1.1 briggs /* 1490 1.1 briggs * Update various transfer-pointers/lengths 1491 1.1 briggs */ 1492 1.1 briggs bytes_done = reqp->dm_cur->dm_count - bytes_left; 1493 1.1 briggs 1494 1.1 briggs if ((reqp->dr_flag & DRIVER_BOUNCING) && (PH_IN(reqp->phase))) { 1495 1.1 briggs /* 1496 1.1 briggs * Copy the bytes read until now from the bounce buffer 1497 1.1 briggs * to the 'real' destination. Flush the data-cache 1498 1.1 briggs * before copying. 1499 1.1 briggs */ 1500 1.1 briggs PCIA(); 1501 1.57 chs memcpy(reqp->xdata_ptr, reqp->bouncerp, bytes_done); 1502 1.1 briggs reqp->bouncerp += bytes_done; 1503 1.1 briggs } 1504 1.1 briggs 1505 1.1 briggs reqp->xdata_ptr = &reqp->xdata_ptr[bytes_done]; /* XXX */ 1506 1.1 briggs reqp->xdata_len -= bytes_done; /* XXX */ 1507 1.1 briggs if ((reqp->dm_cur->dm_count -= bytes_done) == 0) 1508 1.1 briggs reqp->dm_cur++; 1509 1.1 briggs else reqp->dm_cur->dm_addr += bytes_done; 1510 1.1 briggs 1511 1.1 briggs if (PH_IN(reqp->phase) && (dmstat & SC_PAR_ERR)) { 1512 1.27 briggs if (!(ncr5380_no_parchk & (1 << reqp->targ_id))) { 1513 1.27 briggs ncr_tprint(reqp, "parity error in data-phase\n"); 1514 1.27 briggs reqp->xs->error = XS_TIMEOUT; 1515 1.27 briggs } 1516 1.1 briggs } 1517 1.1 briggs 1518 1.1 briggs /* 1519 1.1 briggs * DMA mode should always be reset even when we will continue with the 1520 1.10 briggs * next chain. It is also essential to clear the MON_BUSY because 1521 1.10 briggs * when LOST_BUSY is unexpectedly set, we will not be able to drive 1522 1.10 briggs * the bus.... 1523 1.1 briggs */ 1524 1.10 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 1525 1.1 briggs 1526 1.1 briggs 1527 1.1 briggs if ((dmstat & SC_BSY_ERR) || !(dmstat & SC_PHS_MTCH) 1528 1.1 briggs || (reqp->dm_cur > reqp->dm_last) || (reqp->xs->error)) { 1529 1.1 briggs 1530 1.1 briggs /* 1531 1.1 briggs * Tell interrupt functions DMA mode has ended. 1532 1.1 briggs */ 1533 1.1 briggs reqp->dr_flag &= ~DRIVER_IN_DMA; 1534 1.1 briggs 1535 1.1 briggs /* 1536 1.1 briggs * Clear mode and icom 1537 1.1 briggs */ 1538 1.1 briggs SET_5380_REG(NCR5380_MODE, IMODE_BASE); 1539 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 1540 1.1 briggs 1541 1.1 briggs if (dmstat & SC_BSY_ERR) { 1542 1.1 briggs if (!reqp->xs->error) 1543 1.27 briggs reqp->xs->error = XS_TIMEOUT; 1544 1.1 briggs finish_req(reqp); 1545 1.1 briggs PID("dma_ready1"); 1546 1.1 briggs return (1); 1547 1.1 briggs } 1548 1.1 briggs 1549 1.1 briggs if (reqp->xs->error != 0) { 1550 1.1 briggs ncr_tprint(reqp, "dma-ready: code = %d\n", reqp->xs->error); /* LWP */ 1551 1.1 briggs reqp->msgout = MSG_ABORT; 1552 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 1553 1.1 briggs } 1554 1.1 briggs PID("dma_ready2"); 1555 1.1 briggs return (1); 1556 1.1 briggs } 1557 1.1 briggs return (0); 1558 1.1 briggs } 1559 1.1 briggs #endif /* REAL_DMA */ 1560 1.1 briggs 1561 1.1 briggs static int 1562 1.57 chs check_autosense(SC_REQ *reqp, int linked) 1563 1.1 briggs { 1564 1.1 briggs int sps; 1565 1.1 briggs 1566 1.1 briggs /* 1567 1.14 briggs * If this is the driver's Link Check for this target, ignore 1568 1.14 briggs * the results of the command. All we care about is whether we 1569 1.14 briggs * got here from a LINK_CMD_COMPLETE or CMD_COMPLETE message. 1570 1.14 briggs */ 1571 1.14 briggs PID("linkcheck"); 1572 1.14 briggs if (reqp->dr_flag & DRIVER_LINKCHK) { 1573 1.14 briggs if (linked) 1574 1.14 briggs ncr_will_link |= 1<<reqp->targ_id; 1575 1.16 briggs else ncr_tprint(reqp, "Does not support linked commands\n"); 1576 1.14 briggs return (0); 1577 1.14 briggs } 1578 1.14 briggs /* 1579 1.1 briggs * If we not executing an auto-sense and the status code 1580 1.1 briggs * is request-sense, we automatically issue a request 1581 1.1 briggs * sense command. 1582 1.1 briggs */ 1583 1.1 briggs PID("cautos1"); 1584 1.1 briggs if (!(reqp->dr_flag & DRIVER_AUTOSEN)) { 1585 1.11 briggs switch (reqp->status & SCSMASK) { 1586 1.11 briggs case SCSCHKC: 1587 1.57 chs memcpy(&reqp->xcmd, sense_cmd, sizeof(sense_cmd)); 1588 1.56 thorpej reqp->xcmd_len = sizeof(sense_cmd); 1589 1.39 bouyer reqp->xdata_ptr = (u_char *)&reqp->xs->sense.scsi_sense; 1590 1.39 bouyer reqp->xdata_len = sizeof(reqp->xs->sense.scsi_sense); 1591 1.1 briggs reqp->dr_flag |= DRIVER_AUTOSEN; 1592 1.1 briggs reqp->dr_flag &= ~DRIVER_DMAOK; 1593 1.1 briggs if (!linked) { 1594 1.1 briggs sps = splbio(); 1595 1.1 briggs reqp->next = issue_q; 1596 1.1 briggs issue_q = reqp; 1597 1.1 briggs splx(sps); 1598 1.1 briggs } 1599 1.14 briggs else reqp->xcmd.bytes[sizeof(sense_cmd)-2] |= 1; 1600 1.1 briggs 1601 1.1 briggs #ifdef DBG_REQ 1602 1.57 chs memset(reqp->xdata_ptr, 0, reqp->xdata_len); 1603 1.1 briggs if (dbg_target_mask & (1 << reqp->targ_id)) 1604 1.1 briggs show_request(reqp, "AUTO-SENSE"); 1605 1.1 briggs #endif 1606 1.1 briggs PID("cautos2"); 1607 1.1 briggs return (-1); 1608 1.11 briggs case SCSBUSY: 1609 1.11 briggs reqp->xs->error = XS_BUSY; 1610 1.11 briggs return (0); 1611 1.1 briggs } 1612 1.1 briggs } 1613 1.1 briggs else { 1614 1.1 briggs /* 1615 1.1 briggs * An auto-sense has finished 1616 1.1 briggs */ 1617 1.1 briggs if ((reqp->status & SCSMASK) != SCSGOOD) 1618 1.1 briggs reqp->xs->error = XS_DRIVER_STUFFUP; /* SC_E_AUTOSEN; */ 1619 1.1 briggs else reqp->xs->error = XS_SENSE; 1620 1.1 briggs reqp->status = SCSCHKC; 1621 1.1 briggs } 1622 1.1 briggs PID("cautos3"); 1623 1.1 briggs return (0); 1624 1.1 briggs } 1625 1.1 briggs 1626 1.1 briggs static int 1627 1.57 chs reach_msg_out(struct ncr_softc *sc, u_long len) 1628 1.1 briggs { 1629 1.1 briggs u_char phase; 1630 1.27 briggs u_long n = len; 1631 1.1 briggs 1632 1.1 briggs ncr_aprint(sc, "Trying to reach Message-out phase\n"); 1633 1.1 briggs if ((phase = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ) 1634 1.1 briggs phase = (phase >> 2) & 7; 1635 1.1 briggs else return (-1); 1636 1.1 briggs ncr_aprint(sc, "Trying to reach Message-out phase, now: %d\n", phase); 1637 1.1 briggs if (phase == PH_MSGOUT) 1638 1.1 briggs return (0); 1639 1.1 briggs 1640 1.1 briggs SET_5380_REG(NCR5380_TCOM, phase); 1641 1.1 briggs 1642 1.1 briggs do { 1643 1.1 briggs if (!wait_req_true()) 1644 1.1 briggs break; 1645 1.1 briggs if (((GET_5380_REG(NCR5380_IDSTAT) >> 2) & 7) != phase) 1646 1.1 briggs break; 1647 1.1 briggs if (PH_IN(phase)) { 1648 1.66 martin GET_5380_REG(NCR5380_DATA); 1649 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ACK | SC_A_ATN); 1650 1.1 briggs } 1651 1.1 briggs else { 1652 1.1 briggs SET_5380_REG(NCR5380_DATA, 0); 1653 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_ADTB|SC_A_ACK|SC_A_ATN); 1654 1.1 briggs } 1655 1.1 briggs if (!wait_req_false()) 1656 1.1 briggs break; 1657 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_ATN); 1658 1.27 briggs } while (--n); 1659 1.1 briggs 1660 1.1 briggs if ((phase = GET_5380_REG(NCR5380_IDSTAT)) & SC_S_REQ) { 1661 1.1 briggs phase = (phase >> 2) & 7; 1662 1.1 briggs if (phase == PH_MSGOUT) { 1663 1.27 briggs ncr_aprint(sc, "Message-out phase reached after " 1664 1.27 briggs "%ld bytes.\n", len - n); 1665 1.1 briggs return (0); 1666 1.1 briggs } 1667 1.1 briggs } 1668 1.1 briggs return (-1); 1669 1.1 briggs } 1670 1.1 briggs 1671 1.28 briggs void 1672 1.57 chs scsi_reset(void) 1673 1.1 briggs { 1674 1.1 briggs SC_REQ *tmp, *next; 1675 1.1 briggs int sps; 1676 1.1 briggs 1677 1.1 briggs PID("scsi_reset1"); 1678 1.1 briggs sps = splbio(); 1679 1.1 briggs SET_5380_REG(NCR5380_ICOM, SC_A_RST); 1680 1.20 briggs delay(100); 1681 1.1 briggs SET_5380_REG(NCR5380_ICOM, 0); 1682 1.20 briggs scsi_clr_ipend(); 1683 1.1 briggs 1684 1.1 briggs /* 1685 1.1 briggs * None of the jobs in the discon_q will ever be reconnected, 1686 1.1 briggs * notify this to the higher level code. 1687 1.1 briggs */ 1688 1.1 briggs for (tmp = discon_q; tmp ;) { 1689 1.1 briggs next = tmp->next; 1690 1.1 briggs tmp->next = NULL; 1691 1.1 briggs tmp->xs->error = XS_TIMEOUT; 1692 1.1 briggs busy &= ~(1 << tmp->targ_id); 1693 1.1 briggs finish_req(tmp); 1694 1.1 briggs tmp = next; 1695 1.1 briggs } 1696 1.1 briggs discon_q = NULL; 1697 1.1 briggs 1698 1.1 briggs /* 1699 1.1 briggs * The current job will never finish either. 1700 1.1 briggs * The problem is that we can't finish the job because an instance 1701 1.1 briggs * of main is running on it. Our best guess is that the job is currently 1702 1.1 briggs * doing REAL-DMA. In that case 'dma_ready()' should correctly finish 1703 1.1 briggs * the job because it detects BSY-loss. 1704 1.1 briggs */ 1705 1.27 briggs if ((tmp = connected) != NULL) { 1706 1.1 briggs if (tmp->dr_flag & DRIVER_IN_DMA) { 1707 1.1 briggs tmp->xs->error = XS_DRIVER_STUFFUP; 1708 1.1 briggs #ifdef REAL_DMA 1709 1.1 briggs dma_ready(); 1710 1.1 briggs #endif 1711 1.1 briggs } 1712 1.1 briggs } 1713 1.1 briggs splx(sps); 1714 1.1 briggs PID("scsi_reset2"); 1715 1.20 briggs 1716 1.20 briggs /* 1717 1.20 briggs * Give the attached devices some time to handle the reset. This 1718 1.20 briggs * value is arbitrary but should be relatively long. 1719 1.20 briggs */ 1720 1.20 briggs delay(100000); 1721 1.20 briggs } 1722 1.20 briggs 1723 1.20 briggs static void 1724 1.57 chs scsi_reset_verbose(struct ncr_softc *sc, const char *why) 1725 1.20 briggs { 1726 1.20 briggs ncr_aprint(sc, "Resetting SCSI-bus (%s)\n", why); 1727 1.20 briggs 1728 1.20 briggs scsi_reset(); 1729 1.1 briggs } 1730 1.1 briggs 1731 1.1 briggs /* 1732 1.1 briggs * Check validity of the IRQ set by the 5380. If the interrupt is valid, 1733 1.1 briggs * the appropriate action is carried out (reselection or DMA ready) and 1734 1.1 briggs * INTR_RESEL or INTR_DMA is returned. Otherwise a console notice is written 1735 1.1 briggs * and INTR_SPURIOUS is returned. 1736 1.1 briggs */ 1737 1.1 briggs static int 1738 1.57 chs check_intr(struct ncr_softc *sc) 1739 1.1 briggs { 1740 1.1 briggs SC_REQ *reqp; 1741 1.1 briggs 1742 1.1 briggs if ((GET_5380_REG(NCR5380_IDSTAT) & (SC_S_SEL|SC_S_IO)) 1743 1.1 briggs ==(SC_S_SEL|SC_S_IO)) 1744 1.1 briggs return (INTR_RESEL); 1745 1.1 briggs else { 1746 1.1 briggs if ((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)){ 1747 1.1 briggs reqp->dr_flag &= ~DRIVER_IN_DMA; 1748 1.1 briggs return (INTR_DMA); 1749 1.1 briggs } 1750 1.1 briggs } 1751 1.1 briggs scsi_clr_ipend(); 1752 1.35 christos printf("-->"); 1753 1.1 briggs scsi_show(); 1754 1.1 briggs ncr_aprint(sc, "Spurious interrupt.\n"); 1755 1.1 briggs return (INTR_SPURIOUS); 1756 1.1 briggs } 1757 1.1 briggs 1758 1.1 briggs #ifdef REAL_DMA 1759 1.1 briggs /* 1760 1.1 briggs * Check if DMA can be used for this request. This function also builds 1761 1.52 wiz * the DMA-chain. 1762 1.1 briggs */ 1763 1.1 briggs static int 1764 1.57 chs scsi_dmaok(SC_REQ *reqp) 1765 1.1 briggs { 1766 1.1 briggs u_long phy_buf; 1767 1.1 briggs u_long phy_len; 1768 1.1 briggs void *req_addr; 1769 1.1 briggs u_long req_len; 1770 1.1 briggs struct dma_chain *dm; 1771 1.1 briggs 1772 1.1 briggs /* 1773 1.1 briggs * Initialize locals and requests' DMA-chain. 1774 1.1 briggs */ 1775 1.1 briggs req_len = reqp->xdata_len; 1776 1.1 briggs req_addr = (void*)reqp->xdata_ptr; 1777 1.1 briggs dm = reqp->dm_cur = reqp->dm_last = reqp->dm_chain; 1778 1.1 briggs dm->dm_count = dm->dm_addr = 0; 1779 1.1 briggs reqp->dr_flag &= ~DRIVER_BOUNCING; 1780 1.1 briggs 1781 1.1 briggs /* 1782 1.1 briggs * Do not accept zero length DMA. 1783 1.1 briggs */ 1784 1.1 briggs if (req_len == 0) 1785 1.1 briggs return (0); 1786 1.1 briggs 1787 1.1 briggs /* 1788 1.71 andvar * LWP: I think that this restriction is not strictly necessary. 1789 1.1 briggs */ 1790 1.1 briggs if ((req_len & 0x1) || ((u_int)req_addr & 0x3)) 1791 1.1 briggs return (0); 1792 1.1 briggs 1793 1.1 briggs /* 1794 1.1 briggs * Build the DMA-chain. 1795 1.1 briggs */ 1796 1.1 briggs dm->dm_addr = phy_buf = kvtop(req_addr); 1797 1.1 briggs while (req_len) { 1798 1.51 thorpej if (req_len < 1799 1.51 thorpej (phy_len = PAGE_SIZE - m68k_page_offset(req_addr))) 1800 1.1 briggs phy_len = req_len; 1801 1.1 briggs 1802 1.1 briggs req_addr += phy_len; 1803 1.1 briggs req_len -= phy_len; 1804 1.1 briggs dm->dm_count += phy_len; 1805 1.1 briggs 1806 1.1 briggs if (req_len) { 1807 1.1 briggs u_long tmp = kvtop(req_addr); 1808 1.1 briggs 1809 1.1 briggs if ((phy_buf + phy_len) != tmp) { 1810 1.1 briggs if (wrong_dma_range(reqp, dm)) { 1811 1.1 briggs if (reqp->dr_flag & DRIVER_BOUNCING) 1812 1.1 briggs goto bounceit; 1813 1.1 briggs return (0); 1814 1.1 briggs } 1815 1.1 briggs 1816 1.1 briggs if (++dm >= &reqp->dm_chain[MAXDMAIO]) { 1817 1.1 briggs ncr_tprint(reqp,"dmaok: DMA chain too long!\n"); 1818 1.1 briggs return (0); 1819 1.1 briggs } 1820 1.1 briggs dm->dm_count = 0; 1821 1.1 briggs dm->dm_addr = tmp; 1822 1.1 briggs } 1823 1.1 briggs phy_buf = tmp; 1824 1.1 briggs } 1825 1.1 briggs } 1826 1.1 briggs if (wrong_dma_range(reqp, dm)) { 1827 1.1 briggs if (reqp->dr_flag & DRIVER_BOUNCING) 1828 1.1 briggs goto bounceit; 1829 1.1 briggs return (0); 1830 1.1 briggs } 1831 1.1 briggs reqp->dm_last = dm; 1832 1.1 briggs return (1); 1833 1.1 briggs 1834 1.1 briggs bounceit: 1835 1.1 briggs if ((reqp->bounceb = alloc_bounceb(reqp->xdata_len)) == NULL) { 1836 1.1 briggs /* 1837 1.1 briggs * If we can't get a bounce buffer, forget DMA 1838 1.1 briggs */ 1839 1.1 briggs reqp->dr_flag &= ~DRIVER_BOUNCING; 1840 1.1 briggs return(0); 1841 1.1 briggs } 1842 1.1 briggs /* 1843 1.1 briggs * Initialize a single DMA-range containing the bounced request 1844 1.1 briggs */ 1845 1.1 briggs dm = reqp->dm_cur = reqp->dm_last = reqp->dm_chain; 1846 1.1 briggs dm->dm_addr = kvtop(reqp->bounceb); 1847 1.1 briggs dm->dm_count = reqp->xdata_len; 1848 1.1 briggs reqp->bouncerp = reqp->bounceb; 1849 1.1 briggs 1850 1.1 briggs return (1); 1851 1.1 briggs } 1852 1.1 briggs #endif /* REAL_DMA */ 1853 1.1 briggs 1854 1.1 briggs static void 1855 1.57 chs run_main(struct ncr_softc *sc) 1856 1.1 briggs { 1857 1.1 briggs int sps = splbio(); 1858 1.1 briggs 1859 1.1 briggs if (!main_running) { 1860 1.1 briggs /* 1861 1.1 briggs * If shared resources are required, claim them 1862 1.1 briggs * before entering 'scsi_main'. If we can't get them 1863 1.1 briggs * now, assume 'run_main' will be called when the resource 1864 1.1 briggs * becomes available. 1865 1.1 briggs */ 1866 1.1 briggs if (!claimed_dma()) { 1867 1.1 briggs splx(sps); 1868 1.1 briggs return; 1869 1.1 briggs } 1870 1.1 briggs main_running = 1; 1871 1.1 briggs splx(sps); 1872 1.1 briggs scsi_main(sc); 1873 1.1 briggs } 1874 1.1 briggs else splx(sps); 1875 1.1 briggs } 1876 1.1 briggs 1877 1.1 briggs /* 1878 1.1 briggs * Prefix message with full target info. 1879 1.1 briggs */ 1880 1.1 briggs static void 1881 1.59 jmc ncr_tprint(SC_REQ *reqp, const char *fmt, ...) 1882 1.1 briggs { 1883 1.1 briggs va_list ap; 1884 1.1 briggs 1885 1.1 briggs va_start(ap, fmt); 1886 1.47 bouyer scsipi_printaddr(reqp->xs->xs_periph); 1887 1.41 wrstuden vprintf(fmt, ap); 1888 1.1 briggs va_end(ap); 1889 1.1 briggs } 1890 1.1 briggs 1891 1.1 briggs /* 1892 1.1 briggs * Prefix message with adapter info. 1893 1.1 briggs */ 1894 1.1 briggs static void 1895 1.59 jmc ncr_aprint(struct ncr_softc *sc, const char *fmt, ...) 1896 1.1 briggs { 1897 1.1 briggs va_list ap; 1898 1.1 briggs 1899 1.1 briggs va_start(ap, fmt); 1900 1.65 chs printf("%s: ", device_xname(sc->sc_dev)); 1901 1.41 wrstuden vprintf(fmt, ap); 1902 1.1 briggs va_end(ap); 1903 1.1 briggs } 1904 1.1 briggs /**************************************************************************** 1905 1.1 briggs * Start Debugging Functions * 1906 1.1 briggs ****************************************************************************/ 1907 1.1 briggs static void 1908 1.57 chs show_data_sense(struct scsipi_xfer *xs) 1909 1.1 briggs { 1910 1.1 briggs u_char *p1, *p2; 1911 1.1 briggs int i; 1912 1.1 briggs 1913 1.1 briggs p1 = (u_char *) xs->cmd; 1914 1.39 bouyer p2 = (u_char *)&xs->sense.scsi_sense; 1915 1.1 briggs if(*p2 == 0) 1916 1.1 briggs return; /* No(n)sense */ 1917 1.56 thorpej printf("cmd[%d]: ", xs->cmdlen); 1918 1.56 thorpej for (i = 0; i < xs->cmdlen; i++) 1919 1.35 christos printf("%x ", p1[i]); 1920 1.35 christos printf("\nsense: "); 1921 1.39 bouyer for (i = 0; i < sizeof(xs->sense.scsi_sense); i++) 1922 1.35 christos printf("%x ", p2[i]); 1923 1.35 christos printf("\n"); 1924 1.1 briggs } 1925 1.1 briggs 1926 1.1 briggs static void 1927 1.59 jmc show_request(SC_REQ *reqp, const char *qtxt) 1928 1.1 briggs { 1929 1.35 christos printf("REQ-%s: %d %p[%ld] cmd[0]=%x S=%x M=%x R=%x resid=%d dr_flag=%x %s\n", 1930 1.1 briggs qtxt, reqp->targ_id, reqp->xdata_ptr, reqp->xdata_len, 1931 1.1 briggs reqp->xcmd.opcode, reqp->status, reqp->message, 1932 1.16 briggs reqp->xs->error, reqp->xs->resid, reqp->dr_flag, 1933 1.16 briggs reqp->link ? "L":""); 1934 1.1 briggs if (reqp->status == SCSCHKC) 1935 1.1 briggs show_data_sense(reqp->xs); 1936 1.1 briggs } 1937 1.1 briggs 1938 1.59 jmc static const char *sig_names[] = { 1939 1.3 briggs "PAR", "SEL", "I/O", "C/D", "MSG", "REQ", "BSY", "RST", 1940 1.3 briggs "ACK", "ATN", "LBSY", "PMATCH", "IRQ", "EPAR", "DREQ", "EDMA" 1941 1.3 briggs }; 1942 1.3 briggs 1943 1.3 briggs static void 1944 1.57 chs show_signals(u_char dmstat, u_char idstat) 1945 1.3 briggs { 1946 1.3 briggs u_short tmp, mask; 1947 1.27 briggs int j, need_pipe; 1948 1.3 briggs 1949 1.3 briggs tmp = idstat | ((dmstat & 3) << 8); 1950 1.35 christos printf("Bus signals (%02x/%02x): ", idstat, dmstat & 3); 1951 1.3 briggs for (mask = 1, j = need_pipe = 0; mask <= tmp; mask <<= 1, j++) { 1952 1.3 briggs if (tmp & mask) 1953 1.35 christos printf("%s%s", need_pipe++ ? "|" : "", sig_names[j]); 1954 1.3 briggs } 1955 1.35 christos printf("\nDma status (%02x): ", dmstat); 1956 1.3 briggs for (mask = 4, j = 10, need_pipe = 0; mask <= dmstat; mask <<= 1, j++) { 1957 1.3 briggs if (dmstat & mask) 1958 1.35 christos printf("%s%s", need_pipe++ ? "|" : "", sig_names[j]); 1959 1.3 briggs } 1960 1.35 christos printf("\n"); 1961 1.3 briggs } 1962 1.3 briggs 1963 1.27 briggs void 1964 1.57 chs scsi_show(void) 1965 1.1 briggs { 1966 1.1 briggs SC_REQ *tmp; 1967 1.1 briggs int sps = splhigh(); 1968 1.3 briggs u_char idstat, dmstat; 1969 1.29 briggs #ifdef DBG_PID 1970 1.16 briggs int i; 1971 1.29 briggs #endif 1972 1.1 briggs 1973 1.35 christos printf("scsi_show: scsi_main is%s running\n", 1974 1.28 briggs main_running ? "" : " not"); 1975 1.1 briggs for (tmp = issue_q; tmp; tmp = tmp->next) 1976 1.1 briggs show_request(tmp, "ISSUED"); 1977 1.1 briggs for (tmp = discon_q; tmp; tmp = tmp->next) 1978 1.1 briggs show_request(tmp, "DISCONNECTED"); 1979 1.1 briggs if (connected) 1980 1.1 briggs show_request(connected, "CONNECTED"); 1981 1.3 briggs idstat = GET_5380_REG(NCR5380_IDSTAT); 1982 1.3 briggs dmstat = GET_5380_REG(NCR5380_DMSTAT); 1983 1.3 briggs show_signals(dmstat, idstat); 1984 1.1 briggs if (connected) 1985 1.35 christos printf("phase = %d, ", connected->phase); 1986 1.35 christos printf("busy:%x, spl:%04x\n", busy, sps); 1987 1.16 briggs #ifdef DBG_PID 1988 1.17 briggs for (i=0; i<DBG_PID; i++) 1989 1.35 christos printf("\t%d\t%s\n", i, last_hit[i]); 1990 1.16 briggs #endif 1991 1.1 briggs 1992 1.1 briggs splx(sps); 1993 1.1 briggs } 1994