1 /*- 2 * Device driver optimized for the Symbios/LSI 53C896/53C895A/53C1010 3 * PCI-SCSI controllers. 4 * 5 * Copyright (C) 1999-2001 Gerard Roudier <groudier@free.fr> 6 * 7 * This driver also supports the following Symbios/LSI PCI-SCSI chips: 8 * 53C810A, 53C825A, 53C860, 53C875, 53C876, 53C885, 53C895, 9 * 53C810, 53C815, 53C825 and the 53C1510D is 53C8XX mode. 10 * 11 * 12 * This driver for FreeBSD-CAM is derived from the Linux sym53c8xx driver. 13 * Copyright (C) 1998-1999 Gerard Roudier 14 * 15 * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 16 * a port of the FreeBSD ncr driver to Linux-1.2.13. 17 * 18 * The original ncr driver has been written for 386bsd and FreeBSD by 19 * Wolfgang Stanglmeier <wolf@cologne.de> 20 * Stefan Esser <se@mi.Uni-Koeln.de> 21 * Copyright (C) 1994 Wolfgang Stanglmeier 22 * 23 * The initialisation code, and part of the code that addresses 24 * FreeBSD-CAM services is based on the aic7xxx driver for FreeBSD-CAM 25 * written by Justin T. Gibbs. 26 * 27 * Other major contributions: 28 * 29 * NVRAM detection and reading. 30 * Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk> 31 * 32 *----------------------------------------------------------------------------- 33 * 34 * Redistribution and use in source and binary forms, with or without 35 * modification, are permitted provided that the following conditions 36 * are met: 37 * 1. Redistributions of source code must retain the above copyright 38 * notice, this list of conditions and the following disclaimer. 39 * 2. Redistributions in binary form must reproduce the above copyright 40 * notice, this list of conditions and the following disclaimer in the 41 * documentation and/or other materials provided with the distribution. 42 * 3. The name of the author may not be used to endorse or promote products 43 * derived from this software without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 49 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55 * SUCH DAMAGE. 56 */ 57 58 /* $FreeBSD$ */ 59 60 /* 61 * Scripts for SYMBIOS-Processor 62 * 63 * We have to know the offsets of all labels before we reach 64 * them (for forward jumps). Therefore we declare a struct 65 * here. If you make changes inside the script, 66 * 67 * DONT FORGET TO CHANGE THE LENGTHS HERE! 68 */ 69 70 /* 71 * Script fragments which are loaded into the on-chip RAM 72 * of 825A, 875, 876, 895, 895A, 896 and 1010 chips. 73 * Must not exceed 4K bytes. 74 */ 75 struct SYM_FWA_SCR { 76 u32 start [ 14]; 77 u32 getjob_begin [ 4]; 78 u32 getjob_end [ 4]; 79 u32 select [ 8]; 80 u32 wf_sel_done [ 2]; 81 u32 sel_done [ 2]; 82 u32 send_ident [ 2]; 83 #ifdef SYM_CONF_IARB_SUPPORT 84 u32 select2 [ 8]; 85 #else 86 u32 select2 [ 2]; 87 #endif 88 u32 command [ 2]; 89 u32 dispatch [ 28]; 90 u32 sel_no_cmd [ 10]; 91 u32 init [ 6]; 92 u32 clrack [ 4]; 93 u32 disp_status [ 4]; 94 u32 datai_done [ 26]; 95 u32 datao_done [ 12]; 96 u32 datai_phase [ 2]; 97 u32 datao_phase [ 4]; 98 u32 msg_in [ 2]; 99 u32 msg_in2 [ 10]; 100 #ifdef SYM_CONF_IARB_SUPPORT 101 u32 status [ 14]; 102 #else 103 u32 status [ 10]; 104 #endif 105 u32 complete [ 8]; 106 u32 complete2 [ 12]; 107 u32 complete_error [ 4]; 108 u32 done [ 14]; 109 u32 done_end [ 2]; 110 u32 save_dp [ 8]; 111 u32 restore_dp [ 4]; 112 u32 disconnect [ 20]; 113 #ifdef SYM_CONF_IARB_SUPPORT 114 u32 idle [ 4]; 115 #else 116 u32 idle [ 2]; 117 #endif 118 #ifdef SYM_CONF_IARB_SUPPORT 119 u32 ungetjob [ 6]; 120 #else 121 u32 ungetjob [ 4]; 122 #endif 123 u32 reselect [ 4]; 124 u32 reselected [ 22]; 125 u32 resel_scntl4 [ 20]; 126 u32 resel_lun0 [ 6]; 127 #if SYM_CONF_MAX_TASK*4 > 512 128 u32 resel_tag [ 26]; 129 #elif SYM_CONF_MAX_TASK*4 > 256 130 u32 resel_tag [ 20]; 131 #else 132 u32 resel_tag [ 16]; 133 #endif 134 u32 resel_dsa [ 2]; 135 u32 resel_dsa1 [ 6]; 136 u32 resel_no_tag [ 6]; 137 u32 data_in [SYM_CONF_MAX_SG * 2]; 138 u32 data_in2 [ 4]; 139 u32 data_out [SYM_CONF_MAX_SG * 2]; 140 u32 data_out2 [ 4]; 141 u32 pm0_data [ 12]; 142 u32 pm0_data_out [ 6]; 143 u32 pm0_data_end [ 6]; 144 u32 pm1_data [ 12]; 145 u32 pm1_data_out [ 6]; 146 u32 pm1_data_end [ 6]; 147 }; 148 149 /* 150 * Script fragments which stay in main memory for all chips 151 * except for chips that support 8K on-chip RAM. 152 */ 153 struct SYM_FWB_SCR { 154 u32 start64 [ 2]; 155 u32 no_data [ 2]; 156 u32 sel_for_abort [ 18]; 157 u32 sel_for_abort_1 [ 2]; 158 u32 msg_in_etc [ 12]; 159 u32 msg_received [ 4]; 160 u32 msg_weird_seen [ 4]; 161 u32 msg_extended [ 20]; 162 u32 msg_bad [ 6]; 163 u32 msg_weird [ 4]; 164 u32 msg_weird1 [ 8]; 165 166 u32 wdtr_resp [ 6]; 167 u32 send_wdtr [ 4]; 168 u32 sdtr_resp [ 6]; 169 u32 send_sdtr [ 4]; 170 u32 ppr_resp [ 6]; 171 u32 send_ppr [ 4]; 172 u32 nego_bad_phase [ 4]; 173 u32 msg_out [ 4]; 174 u32 msg_out_done [ 4]; 175 u32 data_ovrun [ 2]; 176 u32 data_ovrun1 [ 22]; 177 u32 data_ovrun2 [ 8]; 178 u32 abort_resel [ 16]; 179 u32 resend_ident [ 4]; 180 u32 ident_break [ 4]; 181 u32 ident_break_atn [ 4]; 182 u32 sdata_in [ 6]; 183 u32 resel_bad_lun [ 4]; 184 u32 bad_i_t_l [ 4]; 185 u32 bad_i_t_l_q [ 4]; 186 u32 bad_status [ 6]; 187 u32 pm_handle [ 20]; 188 u32 pm_handle1 [ 4]; 189 u32 pm_save [ 4]; 190 u32 pm0_save [ 14]; 191 u32 pm1_save [ 14]; 192 193 /* WSR handling */ 194 u32 pm_wsr_handle [ 42]; 195 u32 wsr_ma_helper [ 4]; 196 197 /* Data area */ 198 u32 zero [ 1]; 199 u32 scratch [ 1]; 200 u32 pm0_data_addr [ 1]; 201 u32 pm1_data_addr [ 1]; 202 u32 saved_dsa [ 1]; 203 u32 saved_drs [ 1]; 204 u32 done_pos [ 1]; 205 u32 startpos [ 1]; 206 u32 targtbl [ 1]; 207 /* End of data area */ 208 209 u32 snooptest [ 6]; 210 u32 snoopend [ 2]; 211 }; 212 213 static const struct SYM_FWA_SCR SYM_FWA_SCR = { 214 /*--------------------------< START >----------------------------*/ { 215 /* 216 * Switch the LED on. 217 * Will be patched with a NO_OP if LED 218 * not needed or not desired. 219 */ 220 SCR_REG_REG (gpreg, SCR_AND, 0xfe), 221 0, 222 /* 223 * Clear SIGP. 224 */ 225 SCR_FROM_REG (ctest2), 226 0, 227 /* 228 * Stop here if the C code wants to perform 229 * some error recovery procedure manually. 230 * (Indicate this by setting SEM in ISTAT) 231 */ 232 SCR_FROM_REG (istat), 233 0, 234 /* 235 * Report to the C code the next position in 236 * the start queue the SCRIPTS will schedule. 237 * The C code must not change SCRATCHA. 238 */ 239 SCR_LOAD_ABS (scratcha, 4), 240 PADDR_B (startpos), 241 SCR_INT ^ IFTRUE (MASK (SEM, SEM)), 242 SIR_SCRIPT_STOPPED, 243 /* 244 * Start the next job. 245 * 246 * @DSA = start point for this job. 247 * SCRATCHA = address of this job in the start queue. 248 * 249 * We will restore startpos with SCRATCHA if we fails the 250 * arbitration or if it is the idle job. 251 * 252 * The below GETJOB_BEGIN to GETJOB_END section of SCRIPTS 253 * is a critical path. If it is partially executed, it then 254 * may happen that the job address is not yet in the DSA 255 * and the the next queue position points to the next JOB. 256 */ 257 SCR_LOAD_ABS (dsa, 4), 258 PADDR_B (startpos), 259 SCR_LOAD_REL (temp, 4), 260 4, 261 }/*-------------------------< GETJOB_BEGIN >---------------------*/,{ 262 SCR_STORE_ABS (temp, 4), 263 PADDR_B (startpos), 264 SCR_LOAD_REL (dsa, 4), 265 0, 266 }/*-------------------------< GETJOB_END >-----------------------*/,{ 267 SCR_LOAD_REL (temp, 4), 268 0, 269 SCR_RETURN, 270 0, 271 }/*-------------------------< SELECT >---------------------------*/,{ 272 /* 273 * DSA contains the address of a scheduled 274 * data structure. 275 * 276 * SCRATCHA contains the address of the start queue 277 * entry which points to the next job. 278 * 279 * Set Initiator mode. 280 * 281 * (Target mode is left as an exercise for the reader) 282 */ 283 SCR_CLR (SCR_TRG), 284 0, 285 /* 286 * And try to select this target. 287 */ 288 SCR_SEL_TBL_ATN ^ offsetof (struct sym_dsb, select), 289 PADDR_A (ungetjob), 290 /* 291 * Now there are 4 possibilities: 292 * 293 * (1) The chip loses arbitration. 294 * This is ok, because it will try again, 295 * when the bus becomes idle. 296 * (But beware of the timeout function!) 297 * 298 * (2) The chip is reselected. 299 * Then the script processor takes the jump 300 * to the RESELECT label. 301 * 302 * (3) The chip wins arbitration. 303 * Then it will execute SCRIPTS instruction until 304 * the next instruction that checks SCSI phase. 305 * Then will stop and wait for selection to be 306 * complete or selection time-out to occur. 307 * 308 * After having won arbitration, the SCRIPTS 309 * processor is able to execute instructions while 310 * the SCSI core is performing SCSI selection. 311 */ 312 /* 313 * load the savep (saved data pointer) into 314 * the actual data pointer. 315 */ 316 SCR_LOAD_REL (temp, 4), 317 offsetof (struct sym_ccb, phys.head.savep), 318 /* 319 * Initialize the status registers 320 */ 321 SCR_LOAD_REL (scr0, 4), 322 offsetof (struct sym_ccb, phys.head.status), 323 }/*-------------------------< WF_SEL_DONE >----------------------*/,{ 324 SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)), 325 SIR_SEL_ATN_NO_MSG_OUT, 326 }/*-------------------------< SEL_DONE >-------------------------*/,{ 327 /* 328 * C1010-33 errata work-around. 329 * Due to a race, the SCSI core may not have 330 * loaded SCNTL3 on SEL_TBL instruction. 331 * We reload it once phase is stable. 332 * Patched with a NOOP for other chips. 333 */ 334 SCR_LOAD_REL (scntl3, 1), 335 offsetof(struct sym_dsb, select.sel_scntl3), 336 }/*-------------------------< SEND_IDENT >-----------------------*/,{ 337 /* 338 * Selection complete. 339 * Send the IDENTIFY and possibly the TAG message 340 * and negotiation message if present. 341 */ 342 SCR_MOVE_TBL ^ SCR_MSG_OUT, 343 offsetof (struct sym_dsb, smsg), 344 }/*-------------------------< SELECT2 >--------------------------*/,{ 345 #ifdef SYM_CONF_IARB_SUPPORT 346 /* 347 * Set IMMEDIATE ARBITRATION if we have been given 348 * a hint to do so. (Some job to do after this one). 349 */ 350 SCR_FROM_REG (HF_REG), 351 0, 352 SCR_JUMPR ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB)), 353 8, 354 SCR_REG_REG (scntl1, SCR_OR, IARB), 355 0, 356 #endif 357 /* 358 * Anticipate the COMMAND phase. 359 * This is the PHASE we expect at this point. 360 */ 361 SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)), 362 PADDR_A (sel_no_cmd), 363 }/*-------------------------< COMMAND >--------------------------*/,{ 364 /* 365 * ... and send the command 366 */ 367 SCR_MOVE_TBL ^ SCR_COMMAND, 368 offsetof (struct sym_dsb, cmd), 369 }/*-------------------------< DISPATCH >-------------------------*/,{ 370 /* 371 * MSG_IN is the only phase that shall be 372 * entered at least once for each (re)selection. 373 * So we test it first. 374 */ 375 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), 376 PADDR_A (msg_in), 377 SCR_JUMP ^ IFTRUE (IF (SCR_DATA_OUT)), 378 PADDR_A (datao_phase), 379 SCR_JUMP ^ IFTRUE (IF (SCR_DATA_IN)), 380 PADDR_A (datai_phase), 381 SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)), 382 PADDR_A (status), 383 SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)), 384 PADDR_A (command), 385 SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)), 386 PADDR_B (msg_out), 387 /* 388 * Discard as many illegal phases as 389 * required and tell the C code about. 390 */ 391 SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_OUT)), 392 16, 393 SCR_MOVE_ABS (1) ^ SCR_ILG_OUT, 394 HADDR_1 (scratch), 395 SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_OUT)), 396 -16, 397 SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_IN)), 398 16, 399 SCR_MOVE_ABS (1) ^ SCR_ILG_IN, 400 HADDR_1 (scratch), 401 SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_IN)), 402 -16, 403 SCR_INT, 404 SIR_BAD_PHASE, 405 SCR_JUMP, 406 PADDR_A (dispatch), 407 }/*-------------------------< SEL_NO_CMD >-----------------------*/,{ 408 /* 409 * The target does not switch to command 410 * phase after IDENTIFY has been sent. 411 * 412 * If it stays in MSG OUT phase send it 413 * the IDENTIFY again. 414 */ 415 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)), 416 PADDR_B (resend_ident), 417 /* 418 * If target does not switch to MSG IN phase 419 * and we sent a negotiation, assert the 420 * failure immediately. 421 */ 422 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), 423 PADDR_A (dispatch), 424 SCR_FROM_REG (HS_REG), 425 0, 426 SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)), 427 SIR_NEGO_FAILED, 428 /* 429 * Jump to dispatcher. 430 */ 431 SCR_JUMP, 432 PADDR_A (dispatch), 433 }/*-------------------------< INIT >-----------------------------*/,{ 434 /* 435 * Wait for the SCSI RESET signal to be 436 * inactive before restarting operations, 437 * since the chip may hang on SEL_ATN 438 * if SCSI RESET is active. 439 */ 440 SCR_FROM_REG (sstat0), 441 0, 442 SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)), 443 -16, 444 SCR_JUMP, 445 PADDR_A (start), 446 }/*-------------------------< CLRACK >---------------------------*/,{ 447 /* 448 * Terminate possible pending message phase. 449 */ 450 SCR_CLR (SCR_ACK), 451 0, 452 SCR_JUMP, 453 PADDR_A (dispatch), 454 }/*-------------------------< DISP_STATUS >----------------------*/,{ 455 /* 456 * Anticipate STATUS phase. 457 * 458 * Does spare 3 SCRIPTS instructions when we have 459 * completed the INPUT of the data. 460 */ 461 SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)), 462 PADDR_A (status), 463 SCR_JUMP, 464 PADDR_A (dispatch), 465 }/*-------------------------< DATAI_DONE >-----------------------*/,{ 466 /* 467 * If the device still wants to send us data, 468 * we must count the extra bytes. 469 */ 470 SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_IN)), 471 PADDR_B (data_ovrun), 472 /* 473 * If the SWIDE is not full, jump to dispatcher. 474 * We anticipate a STATUS phase. 475 */ 476 SCR_FROM_REG (scntl2), 477 0, 478 SCR_JUMP ^ IFFALSE (MASK (WSR, WSR)), 479 PADDR_A (disp_status), 480 /* 481 * The SWIDE is full. 482 * Clear this condition. 483 */ 484 SCR_REG_REG (scntl2, SCR_OR, WSR), 485 0, 486 /* 487 * We are expecting an IGNORE RESIDUE message 488 * from the device, otherwise we are in data 489 * overrun condition. Check against MSG_IN phase. 490 */ 491 SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)), 492 SIR_SWIDE_OVERRUN, 493 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)), 494 PADDR_A (disp_status), 495 /* 496 * We are in MSG_IN phase, 497 * Read the first byte of the message. 498 * If it is not an IGNORE RESIDUE message, 499 * signal overrun and jump to message 500 * processing. 501 */ 502 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 503 HADDR_1 (msgin[0]), 504 SCR_INT ^ IFFALSE (DATA (M_IGN_RESIDUE)), 505 SIR_SWIDE_OVERRUN, 506 SCR_JUMP ^ IFFALSE (DATA (M_IGN_RESIDUE)), 507 PADDR_A (msg_in2), 508 /* 509 * We got the message we expected. 510 * Read the 2nd byte, and jump to dispatcher. 511 */ 512 SCR_CLR (SCR_ACK), 513 0, 514 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 515 HADDR_1 (msgin[1]), 516 SCR_CLR (SCR_ACK), 517 0, 518 SCR_JUMP, 519 PADDR_A (disp_status), 520 }/*-------------------------< DATAO_DONE >-----------------------*/,{ 521 /* 522 * If the device wants us to send more data, 523 * we must count the extra bytes. 524 */ 525 SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)), 526 PADDR_B (data_ovrun), 527 /* 528 * If the SODL is not full jump to dispatcher. 529 * We anticipate a STATUS phase. 530 */ 531 SCR_FROM_REG (scntl2), 532 0, 533 SCR_JUMP ^ IFFALSE (MASK (WSS, WSS)), 534 PADDR_A (disp_status), 535 /* 536 * The SODL is full, clear this condition. 537 */ 538 SCR_REG_REG (scntl2, SCR_OR, WSS), 539 0, 540 /* 541 * And signal a DATA UNDERRUN condition 542 * to the C code. 543 */ 544 SCR_INT, 545 SIR_SODL_UNDERRUN, 546 SCR_JUMP, 547 PADDR_A (dispatch), 548 }/*-------------------------< DATAI_PHASE >----------------------*/,{ 549 SCR_RETURN, 550 0, 551 }/*-------------------------< DATAO_PHASE >----------------------*/,{ 552 /* 553 * C1010-66 errata work-around. 554 * Extra clocks of data hold must be inserted 555 * in DATA OUT phase on 33 MHz PCI BUS. 556 * Patched with a NOOP for other chips. 557 */ 558 SCR_REG_REG (scntl4, SCR_OR, (XCLKH_DT|XCLKH_ST)), 559 0, 560 SCR_RETURN, 561 0, 562 }/*-------------------------< MSG_IN >---------------------------*/,{ 563 /* 564 * Get the first byte of the message. 565 * 566 * The script processor doesn't negate the 567 * ACK signal after this transfer. 568 */ 569 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 570 HADDR_1 (msgin[0]), 571 }/*-------------------------< MSG_IN2 >--------------------------*/,{ 572 /* 573 * Check first against 1 byte messages 574 * that we handle from SCRIPTS. 575 */ 576 SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)), 577 PADDR_A (complete), 578 SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)), 579 PADDR_A (disconnect), 580 SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)), 581 PADDR_A (save_dp), 582 SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)), 583 PADDR_A (restore_dp), 584 /* 585 * We handle all other messages from the 586 * C code, so no need to waste on-chip RAM 587 * for those ones. 588 */ 589 SCR_JUMP, 590 PADDR_B (msg_in_etc), 591 }/*-------------------------< STATUS >---------------------------*/,{ 592 /* 593 * get the status 594 */ 595 SCR_MOVE_ABS (1) ^ SCR_STATUS, 596 HADDR_1 (scratch), 597 #ifdef SYM_CONF_IARB_SUPPORT 598 /* 599 * If STATUS is not GOOD, clear IMMEDIATE ARBITRATION, 600 * since we may have to tamper the start queue from 601 * the C code. 602 */ 603 SCR_JUMPR ^ IFTRUE (DATA (S_GOOD)), 604 8, 605 SCR_REG_REG (scntl1, SCR_AND, ~IARB), 606 0, 607 #endif 608 /* 609 * save status to scsi_status. 610 * mark as complete. 611 */ 612 SCR_TO_REG (SS_REG), 613 0, 614 SCR_LOAD_REG (HS_REG, HS_COMPLETE), 615 0, 616 /* 617 * Anticipate the MESSAGE PHASE for 618 * the TASK COMPLETE message. 619 */ 620 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), 621 PADDR_A (msg_in), 622 SCR_JUMP, 623 PADDR_A (dispatch), 624 }/*-------------------------< COMPLETE >-------------------------*/,{ 625 /* 626 * Complete message. 627 * 628 * Copy the data pointer to LASTP. 629 */ 630 SCR_STORE_REL (temp, 4), 631 offsetof (struct sym_ccb, phys.head.lastp), 632 /* 633 * When we terminate the cycle by clearing ACK, 634 * the target may disconnect immediately. 635 * 636 * We don't want to be told of an "unexpected disconnect", 637 * so we disable this feature. 638 */ 639 SCR_REG_REG (scntl2, SCR_AND, 0x7f), 640 0, 641 /* 642 * Terminate cycle ... 643 */ 644 SCR_CLR (SCR_ACK|SCR_ATN), 645 0, 646 /* 647 * ... and wait for the disconnect. 648 */ 649 SCR_WAIT_DISC, 650 0, 651 }/*-------------------------< COMPLETE2 >------------------------*/,{ 652 /* 653 * Save host status. 654 */ 655 SCR_STORE_REL (scr0, 4), 656 offsetof (struct sym_ccb, phys.head.status), 657 /* 658 * Some bridges may reorder DMA writes to memory. 659 * We donnot want the CPU to deal with completions 660 * without all the posted write having been flushed 661 * to memory. This DUMMY READ should flush posted 662 * buffers prior to the CPU having to deal with 663 * completions. 664 */ 665 SCR_LOAD_REL (scr0, 4), /* DUMMY READ */ 666 offsetof (struct sym_ccb, phys.head.status), 667 668 /* 669 * If command resulted in not GOOD status, 670 * call the C code if needed. 671 */ 672 SCR_FROM_REG (SS_REG), 673 0, 674 SCR_CALL ^ IFFALSE (DATA (S_GOOD)), 675 PADDR_B (bad_status), 676 /* 677 * If we performed an auto-sense, call 678 * the C code to synchronyze task aborts 679 * with UNIT ATTENTION conditions. 680 */ 681 SCR_FROM_REG (HF_REG), 682 0, 683 SCR_JUMPR ^ IFTRUE (MASK (0 ,(HF_SENSE|HF_EXT_ERR))), 684 16, 685 }/*-------------------------< COMPLETE_ERROR >-------------------*/,{ 686 SCR_LOAD_ABS (scratcha, 4), 687 PADDR_B (startpos), 688 SCR_INT, 689 SIR_COMPLETE_ERROR, 690 }/*-------------------------< DONE >-----------------------------*/,{ 691 /* 692 * Copy the DSA to the DONE QUEUE and 693 * signal completion to the host. 694 * If we are interrupted between DONE 695 * and DONE_END, we must reset, otherwise 696 * the completed CCB may be lost. 697 */ 698 SCR_STORE_ABS (dsa, 4), 699 PADDR_B (saved_dsa), 700 SCR_LOAD_ABS (dsa, 4), 701 PADDR_B (done_pos), 702 SCR_LOAD_ABS (scratcha, 4), 703 PADDR_B (saved_dsa), 704 SCR_STORE_REL (scratcha, 4), 705 0, 706 /* 707 * The instruction below reads the DONE QUEUE next 708 * free position from memory. 709 * In addition it ensures that all PCI posted writes 710 * are flushed and so the DSA value of the done 711 * CCB is visible by the CPU before INTFLY is raised. 712 */ 713 SCR_LOAD_REL (temp, 4), 714 4, 715 SCR_INT_FLY, 716 0, 717 SCR_STORE_ABS (temp, 4), 718 PADDR_B (done_pos), 719 }/*-------------------------< DONE_END >-------------------------*/,{ 720 SCR_JUMP, 721 PADDR_A (start), 722 }/*-------------------------< SAVE_DP >--------------------------*/,{ 723 /* 724 * Clear ACK immediately. 725 * No need to delay it. 726 */ 727 SCR_CLR (SCR_ACK), 728 0, 729 /* 730 * Keep track we received a SAVE DP, so 731 * we will switch to the other PM context 732 * on the next PM since the DP may point 733 * to the current PM context. 734 */ 735 SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED), 736 0, 737 /* 738 * SAVE_DP message: 739 * Copy the data pointer to SAVEP. 740 */ 741 SCR_STORE_REL (temp, 4), 742 offsetof (struct sym_ccb, phys.head.savep), 743 SCR_JUMP, 744 PADDR_A (dispatch), 745 }/*-------------------------< RESTORE_DP >-----------------------*/,{ 746 /* 747 * RESTORE_DP message: 748 * Copy SAVEP to actual data pointer. 749 */ 750 SCR_LOAD_REL (temp, 4), 751 offsetof (struct sym_ccb, phys.head.savep), 752 SCR_JUMP, 753 PADDR_A (clrack), 754 }/*-------------------------< DISCONNECT >-----------------------*/,{ 755 /* 756 * DISCONNECTing ... 757 * 758 * disable the "unexpected disconnect" feature, 759 * and remove the ACK signal. 760 */ 761 SCR_REG_REG (scntl2, SCR_AND, 0x7f), 762 0, 763 SCR_CLR (SCR_ACK|SCR_ATN), 764 0, 765 /* 766 * Wait for the disconnect. 767 */ 768 SCR_WAIT_DISC, 769 0, 770 /* 771 * Status is: DISCONNECTED. 772 */ 773 SCR_LOAD_REG (HS_REG, HS_DISCONNECT), 774 0, 775 /* 776 * Save host status. 777 */ 778 SCR_STORE_REL (scr0, 4), 779 offsetof (struct sym_ccb, phys.head.status), 780 /* 781 * If QUIRK_AUTOSAVE is set, 782 * do a "save pointer" operation. 783 */ 784 SCR_FROM_REG (QU_REG), 785 0, 786 SCR_JUMP ^ IFFALSE (MASK (SYM_QUIRK_AUTOSAVE, SYM_QUIRK_AUTOSAVE)), 787 PADDR_A (start), 788 /* 789 * like SAVE_DP message: 790 * Remember we saved the data pointer. 791 * Copy data pointer to SAVEP. 792 */ 793 SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED), 794 0, 795 SCR_STORE_REL (temp, 4), 796 offsetof (struct sym_ccb, phys.head.savep), 797 SCR_JUMP, 798 PADDR_A (start), 799 }/*-------------------------< IDLE >-----------------------------*/,{ 800 /* 801 * Nothing to do? 802 * Switch the LED off and wait for reselect. 803 * Will be patched with a NO_OP if LED 804 * not needed or not desired. 805 */ 806 SCR_REG_REG (gpreg, SCR_OR, 0x01), 807 0, 808 #ifdef SYM_CONF_IARB_SUPPORT 809 SCR_JUMPR, 810 8, 811 #endif 812 }/*-------------------------< UNGETJOB >-------------------------*/,{ 813 #ifdef SYM_CONF_IARB_SUPPORT 814 /* 815 * Set IMMEDIATE ARBITRATION, for the next time. 816 * This will give us better chance to win arbitration 817 * for the job we just wanted to do. 818 */ 819 SCR_REG_REG (scntl1, SCR_OR, IARB), 820 0, 821 #endif 822 /* 823 * We are not able to restart the SCRIPTS if we are 824 * interrupted and these instruction haven't been 825 * all executed. BTW, this is very unlikely to 826 * happen, but we check that from the C code. 827 */ 828 SCR_LOAD_REG (dsa, 0xff), 829 0, 830 SCR_STORE_ABS (scratcha, 4), 831 PADDR_B (startpos), 832 }/*-------------------------< RESELECT >-------------------------*/,{ 833 /* 834 * Make sure we are in initiator mode. 835 */ 836 SCR_CLR (SCR_TRG), 837 0, 838 /* 839 * Sleep waiting for a reselection. 840 */ 841 SCR_WAIT_RESEL, 842 PADDR_A(start), 843 }/*-------------------------< RESELECTED >-----------------------*/,{ 844 /* 845 * Switch the LED on. 846 * Will be patched with a NO_OP if LED 847 * not needed or not desired. 848 */ 849 SCR_REG_REG (gpreg, SCR_AND, 0xfe), 850 0, 851 /* 852 * load the target id into the sdid 853 */ 854 SCR_REG_SFBR (ssid, SCR_AND, 0x8F), 855 0, 856 SCR_TO_REG (sdid), 857 0, 858 /* 859 * Load the target control block address 860 */ 861 SCR_LOAD_ABS (dsa, 4), 862 PADDR_B (targtbl), 863 SCR_SFBR_REG (dsa, SCR_SHL, 0), 864 0, 865 SCR_REG_REG (dsa, SCR_SHL, 0), 866 0, 867 SCR_REG_REG (dsa, SCR_AND, 0x3c), 868 0, 869 SCR_LOAD_REL (dsa, 4), 870 0, 871 /* 872 * We expect MESSAGE IN phase. 873 * If not, get help from the C code. 874 */ 875 SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)), 876 SIR_RESEL_NO_MSG_IN, 877 /* 878 * Load the legacy synchronous transfer registers. 879 */ 880 SCR_LOAD_REL (scntl3, 1), 881 offsetof(struct sym_tcb, head.wval), 882 SCR_LOAD_REL (sxfer, 1), 883 offsetof(struct sym_tcb, head.sval), 884 }/*-------------------------< RESEL_SCNTL4 >---------------------*/,{ 885 /* 886 * The C1010 uses a new synchronous timing scheme. 887 * Will be patched with a NO_OP if not a C1010. 888 */ 889 SCR_LOAD_REL (scntl4, 1), 890 offsetof(struct sym_tcb, head.uval), 891 /* 892 * Get the IDENTIFY message. 893 */ 894 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 895 HADDR_1 (msgin), 896 /* 897 * If IDENTIFY LUN #0, use a faster path 898 * to find the LCB structure. 899 */ 900 SCR_JUMP ^ IFTRUE (MASK (0x80, 0xbf)), 901 PADDR_A (resel_lun0), 902 /* 903 * If message isn't an IDENTIFY, 904 * tell the C code about. 905 */ 906 SCR_INT ^ IFFALSE (MASK (0x80, 0x80)), 907 SIR_RESEL_NO_IDENTIFY, 908 /* 909 * It is an IDENTIFY message, 910 * Load the LUN control block address. 911 */ 912 SCR_LOAD_REL (dsa, 4), 913 offsetof(struct sym_tcb, head.luntbl_sa), 914 SCR_SFBR_REG (dsa, SCR_SHL, 0), 915 0, 916 SCR_REG_REG (dsa, SCR_SHL, 0), 917 0, 918 SCR_REG_REG (dsa, SCR_AND, 0xfc), 919 0, 920 SCR_LOAD_REL (dsa, 4), 921 0, 922 SCR_JUMPR, 923 8, 924 }/*-------------------------< RESEL_LUN0 >-----------------------*/,{ 925 /* 926 * LUN 0 special case (but usual one :)) 927 */ 928 SCR_LOAD_REL (dsa, 4), 929 offsetof(struct sym_tcb, head.lun0_sa), 930 /* 931 * Jump indirectly to the reselect action for this LUN. 932 */ 933 SCR_LOAD_REL (temp, 4), 934 offsetof(struct sym_lcb, head.resel_sa), 935 SCR_RETURN, 936 0, 937 /* In normal situations, we jump to RESEL_TAG or RESEL_NO_TAG */ 938 }/*-------------------------< RESEL_TAG >------------------------*/,{ 939 /* 940 * ACK the IDENTIFY previously received. 941 */ 942 SCR_CLR (SCR_ACK), 943 0, 944 /* 945 * It shall be a tagged command. 946 * Read SIMPLE+TAG. 947 * The C code will deal with errors. 948 * Agressive optimization, is'nt it? :) 949 */ 950 SCR_MOVE_ABS (2) ^ SCR_MSG_IN, 951 HADDR_1 (msgin), 952 /* 953 * Load the pointer to the tagged task 954 * table for this LUN. 955 */ 956 SCR_LOAD_REL (dsa, 4), 957 offsetof(struct sym_lcb, head.itlq_tbl_sa), 958 /* 959 * The SIDL still contains the TAG value. 960 * Agressive optimization, isn't it? :):) 961 */ 962 SCR_REG_SFBR (sidl, SCR_SHL, 0), 963 0, 964 #if SYM_CONF_MAX_TASK*4 > 512 965 SCR_JUMPR ^ IFFALSE (CARRYSET), 966 8, 967 SCR_REG_REG (dsa1, SCR_OR, 2), 968 0, 969 SCR_REG_REG (sfbr, SCR_SHL, 0), 970 0, 971 SCR_JUMPR ^ IFFALSE (CARRYSET), 972 8, 973 SCR_REG_REG (dsa1, SCR_OR, 1), 974 0, 975 #elif SYM_CONF_MAX_TASK*4 > 256 976 SCR_JUMPR ^ IFFALSE (CARRYSET), 977 8, 978 SCR_REG_REG (dsa1, SCR_OR, 1), 979 0, 980 #endif 981 /* 982 * Retrieve the DSA of this task. 983 * JUMP indirectly to the restart point of the CCB. 984 */ 985 SCR_SFBR_REG (dsa, SCR_AND, 0xfc), 986 0, 987 SCR_LOAD_REL (dsa, 4), 988 0, 989 SCR_LOAD_REL (temp, 4), 990 offsetof(struct sym_ccb, phys.head.go.restart), 991 SCR_RETURN, 992 0, 993 /* In normal situations we branch to RESEL_DSA */ 994 }/*-------------------------< RESEL_DSA >------------------------*/,{ 995 /* 996 * ACK the IDENTIFY or TAG previously received. 997 */ 998 SCR_CLR (SCR_ACK), 999 0, 1000 }/*-------------------------< RESEL_DSA1 >-----------------------*/,{ 1001 /* 1002 * load the savep (saved pointer) into 1003 * the actual data pointer. 1004 */ 1005 SCR_LOAD_REL (temp, 4), 1006 offsetof (struct sym_ccb, phys.head.savep), 1007 /* 1008 * Initialize the status registers 1009 */ 1010 SCR_LOAD_REL (scr0, 4), 1011 offsetof (struct sym_ccb, phys.head.status), 1012 /* 1013 * Jump to dispatcher. 1014 */ 1015 SCR_JUMP, 1016 PADDR_A (dispatch), 1017 }/*-------------------------< RESEL_NO_TAG >---------------------*/,{ 1018 /* 1019 * Load the DSA with the unique ITL task. 1020 */ 1021 SCR_LOAD_REL (dsa, 4), 1022 offsetof(struct sym_lcb, head.itl_task_sa), 1023 /* 1024 * JUMP indirectly to the restart point of the CCB. 1025 */ 1026 SCR_LOAD_REL (temp, 4), 1027 offsetof(struct sym_ccb, phys.head.go.restart), 1028 SCR_RETURN, 1029 0, 1030 /* In normal situations we branch to RESEL_DSA */ 1031 }/*-------------------------< DATA_IN >--------------------------*/,{ 1032 /* 1033 * Because the size depends on the 1034 * #define SYM_CONF_MAX_SG parameter, 1035 * it is filled in at runtime. 1036 * 1037 * ##===========< i=0; i<SYM_CONF_MAX_SG >========= 1038 * || SCR_CHMOV_TBL ^ SCR_DATA_IN, 1039 * || offsetof (struct sym_dsb, data[ i]), 1040 * ##========================================== 1041 */ 1042 0 1043 }/*-------------------------< DATA_IN2 >-------------------------*/,{ 1044 SCR_CALL, 1045 PADDR_A (datai_done), 1046 SCR_JUMP, 1047 PADDR_B (data_ovrun), 1048 }/*-------------------------< DATA_OUT >-------------------------*/,{ 1049 /* 1050 * Because the size depends on the 1051 * #define SYM_CONF_MAX_SG parameter, 1052 * it is filled in at runtime. 1053 * 1054 * ##===========< i=0; i<SYM_CONF_MAX_SG >========= 1055 * || SCR_CHMOV_TBL ^ SCR_DATA_OUT, 1056 * || offsetof (struct sym_dsb, data[ i]), 1057 * ##========================================== 1058 */ 1059 0 1060 }/*-------------------------< DATA_OUT2 >------------------------*/,{ 1061 SCR_CALL, 1062 PADDR_A (datao_done), 1063 SCR_JUMP, 1064 PADDR_B (data_ovrun), 1065 }/*-------------------------< PM0_DATA >-------------------------*/,{ 1066 /* 1067 * Read our host flags to SFBR, so we will be able 1068 * to check against the data direction we expect. 1069 */ 1070 SCR_FROM_REG (HF_REG), 1071 0, 1072 /* 1073 * Check against actual DATA PHASE. 1074 */ 1075 SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)), 1076 PADDR_A (pm0_data_out), 1077 /* 1078 * Actual phase is DATA IN. 1079 * Check against expected direction. 1080 */ 1081 SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)), 1082 PADDR_B (data_ovrun), 1083 /* 1084 * Keep track we are moving data from the 1085 * PM0 DATA mini-script. 1086 */ 1087 SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0), 1088 0, 1089 /* 1090 * Move the data to memory. 1091 */ 1092 SCR_CHMOV_TBL ^ SCR_DATA_IN, 1093 offsetof (struct sym_ccb, phys.pm0.sg), 1094 SCR_JUMP, 1095 PADDR_A (pm0_data_end), 1096 }/*-------------------------< PM0_DATA_OUT >---------------------*/,{ 1097 /* 1098 * Actual phase is DATA OUT. 1099 * Check against expected direction. 1100 */ 1101 SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)), 1102 PADDR_B (data_ovrun), 1103 /* 1104 * Keep track we are moving data from the 1105 * PM0 DATA mini-script. 1106 */ 1107 SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0), 1108 0, 1109 /* 1110 * Move the data from memory. 1111 */ 1112 SCR_CHMOV_TBL ^ SCR_DATA_OUT, 1113 offsetof (struct sym_ccb, phys.pm0.sg), 1114 }/*-------------------------< PM0_DATA_END >---------------------*/,{ 1115 /* 1116 * Clear the flag that told we were moving 1117 * data from the PM0 DATA mini-script. 1118 */ 1119 SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM0)), 1120 0, 1121 /* 1122 * Return to the previous DATA script which 1123 * is guaranteed by design (if no bug) to be 1124 * the main DATA script for this transfer. 1125 */ 1126 SCR_LOAD_REL (temp, 4), 1127 offsetof (struct sym_ccb, phys.pm0.ret), 1128 SCR_RETURN, 1129 0, 1130 }/*-------------------------< PM1_DATA >-------------------------*/,{ 1131 /* 1132 * Read our host flags to SFBR, so we will be able 1133 * to check against the data direction we expect. 1134 */ 1135 SCR_FROM_REG (HF_REG), 1136 0, 1137 /* 1138 * Check against actual DATA PHASE. 1139 */ 1140 SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)), 1141 PADDR_A (pm1_data_out), 1142 /* 1143 * Actual phase is DATA IN. 1144 * Check against expected direction. 1145 */ 1146 SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)), 1147 PADDR_B (data_ovrun), 1148 /* 1149 * Keep track we are moving data from the 1150 * PM1 DATA mini-script. 1151 */ 1152 SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1), 1153 0, 1154 /* 1155 * Move the data to memory. 1156 */ 1157 SCR_CHMOV_TBL ^ SCR_DATA_IN, 1158 offsetof (struct sym_ccb, phys.pm1.sg), 1159 SCR_JUMP, 1160 PADDR_A (pm1_data_end), 1161 }/*-------------------------< PM1_DATA_OUT >---------------------*/,{ 1162 /* 1163 * Actual phase is DATA OUT. 1164 * Check against expected direction. 1165 */ 1166 SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)), 1167 PADDR_B (data_ovrun), 1168 /* 1169 * Keep track we are moving data from the 1170 * PM1 DATA mini-script. 1171 */ 1172 SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1), 1173 0, 1174 /* 1175 * Move the data from memory. 1176 */ 1177 SCR_CHMOV_TBL ^ SCR_DATA_OUT, 1178 offsetof (struct sym_ccb, phys.pm1.sg), 1179 }/*-------------------------< PM1_DATA_END >---------------------*/,{ 1180 /* 1181 * Clear the flag that told we were moving 1182 * data from the PM1 DATA mini-script. 1183 */ 1184 SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM1)), 1185 0, 1186 /* 1187 * Return to the previous DATA script which 1188 * is guaranteed by design (if no bug) to be 1189 * the main DATA script for this transfer. 1190 */ 1191 SCR_LOAD_REL (temp, 4), 1192 offsetof (struct sym_ccb, phys.pm1.ret), 1193 SCR_RETURN, 1194 0, 1195 }/*-------------------------<>-----------------------------------*/ 1196 }; 1197 1198 static const struct SYM_FWB_SCR SYM_FWB_SCR = { 1199 /*--------------------------< START64 >--------------------------*/ { 1200 /* 1201 * SCRIPT entry point for the 895A, 896 and 1010. 1202 * For now, there is no specific stuff for those 1203 * chips at this point, but this may come. 1204 */ 1205 SCR_JUMP, 1206 PADDR_A (init), 1207 }/*-------------------------< NO_DATA >--------------------------*/,{ 1208 SCR_JUMP, 1209 PADDR_B (data_ovrun), 1210 }/*-------------------------< SEL_FOR_ABORT >--------------------*/,{ 1211 /* 1212 * We are jumped here by the C code, if we have 1213 * some target to reset or some disconnected 1214 * job to abort. Since error recovery is a serious 1215 * busyness, we will really reset the SCSI BUS, if 1216 * case of a SCSI interrupt occuring in this path. 1217 */ 1218 1219 /* 1220 * Set initiator mode. 1221 */ 1222 SCR_CLR (SCR_TRG), 1223 0, 1224 /* 1225 * And try to select this target. 1226 */ 1227 SCR_SEL_TBL_ATN ^ offsetof (struct sym_hcb, abrt_sel), 1228 PADDR_A (reselect), 1229 /* 1230 * Wait for the selection to complete or 1231 * the selection to time out. 1232 */ 1233 SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)), 1234 -8, 1235 /* 1236 * Call the C code. 1237 */ 1238 SCR_INT, 1239 SIR_TARGET_SELECTED, 1240 /* 1241 * The C code should let us continue here. 1242 * Send the 'kiss of death' message. 1243 * We expect an immediate disconnect once 1244 * the target has eaten the message. 1245 */ 1246 SCR_REG_REG (scntl2, SCR_AND, 0x7f), 1247 0, 1248 SCR_MOVE_TBL ^ SCR_MSG_OUT, 1249 offsetof (struct sym_hcb, abrt_tbl), 1250 SCR_CLR (SCR_ACK|SCR_ATN), 1251 0, 1252 SCR_WAIT_DISC, 1253 0, 1254 /* 1255 * Tell the C code that we are done. 1256 */ 1257 SCR_INT, 1258 SIR_ABORT_SENT, 1259 }/*-------------------------< SEL_FOR_ABORT_1 >------------------*/,{ 1260 /* 1261 * Jump at scheduler. 1262 */ 1263 SCR_JUMP, 1264 PADDR_A (start), 1265 }/*-------------------------< MSG_IN_ETC >-----------------------*/,{ 1266 /* 1267 * If it is an EXTENDED (variable size message) 1268 * Handle it. 1269 */ 1270 SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)), 1271 PADDR_B (msg_extended), 1272 /* 1273 * Let the C code handle any other 1274 * 1 byte message. 1275 */ 1276 SCR_JUMP ^ IFTRUE (MASK (0x00, 0xf0)), 1277 PADDR_B (msg_received), 1278 SCR_JUMP ^ IFTRUE (MASK (0x10, 0xf0)), 1279 PADDR_B (msg_received), 1280 /* 1281 * We donnot handle 2 bytes messages from SCRIPTS. 1282 * So, let the C code deal with these ones too. 1283 */ 1284 SCR_JUMP ^ IFFALSE (MASK (0x20, 0xf0)), 1285 PADDR_B (msg_weird_seen), 1286 SCR_CLR (SCR_ACK), 1287 0, 1288 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 1289 HADDR_1 (msgin[1]), 1290 }/*-------------------------< MSG_RECEIVED >---------------------*/,{ 1291 SCR_LOAD_REL (scratcha, 4), /* DUMMY READ */ 1292 0, 1293 SCR_INT, 1294 SIR_MSG_RECEIVED, 1295 }/*-------------------------< MSG_WEIRD_SEEN >-------------------*/,{ 1296 SCR_LOAD_REL (scratcha, 4), /* DUMMY READ */ 1297 0, 1298 SCR_INT, 1299 SIR_MSG_WEIRD, 1300 }/*-------------------------< MSG_EXTENDED >---------------------*/,{ 1301 /* 1302 * Clear ACK and get the next byte 1303 * assumed to be the message length. 1304 */ 1305 SCR_CLR (SCR_ACK), 1306 0, 1307 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 1308 HADDR_1 (msgin[1]), 1309 /* 1310 * Try to catch some unlikely situations as 0 length 1311 * or too large the length. 1312 */ 1313 SCR_JUMP ^ IFTRUE (DATA (0)), 1314 PADDR_B (msg_weird_seen), 1315 SCR_TO_REG (scratcha), 1316 0, 1317 SCR_REG_REG (sfbr, SCR_ADD, (256-8)), 1318 0, 1319 SCR_JUMP ^ IFTRUE (CARRYSET), 1320 PADDR_B (msg_weird_seen), 1321 /* 1322 * We donnot handle extended messages from SCRIPTS. 1323 * Read the amount of data correponding to the 1324 * message length and call the C code. 1325 */ 1326 SCR_STORE_REL (scratcha, 1), 1327 offsetof (struct sym_dsb, smsg_ext.size), 1328 SCR_CLR (SCR_ACK), 1329 0, 1330 SCR_MOVE_TBL ^ SCR_MSG_IN, 1331 offsetof (struct sym_dsb, smsg_ext), 1332 SCR_JUMP, 1333 PADDR_B (msg_received), 1334 }/*-------------------------< MSG_BAD >--------------------------*/,{ 1335 /* 1336 * unimplemented message - reject it. 1337 */ 1338 SCR_INT, 1339 SIR_REJECT_TO_SEND, 1340 SCR_SET (SCR_ATN), 1341 0, 1342 SCR_JUMP, 1343 PADDR_A (clrack), 1344 }/*-------------------------< MSG_WEIRD >------------------------*/,{ 1345 /* 1346 * weird message received 1347 * ignore all MSG IN phases and reject it. 1348 */ 1349 SCR_INT, 1350 SIR_REJECT_TO_SEND, 1351 SCR_SET (SCR_ATN), 1352 0, 1353 }/*-------------------------< MSG_WEIRD1 >-----------------------*/,{ 1354 SCR_CLR (SCR_ACK), 1355 0, 1356 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)), 1357 PADDR_A (dispatch), 1358 SCR_MOVE_ABS (1) ^ SCR_MSG_IN, 1359 HADDR_1 (scratch), 1360 SCR_JUMP, 1361 PADDR_B (msg_weird1), 1362 }/*-------------------------< WDTR_RESP >------------------------*/,{ 1363 /* 1364 * let the target fetch our answer. 1365 */ 1366 SCR_SET (SCR_ATN), 1367 0, 1368 SCR_CLR (SCR_ACK), 1369 0, 1370 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), 1371 PADDR_B (nego_bad_phase), 1372 }/*-------------------------< SEND_WDTR >------------------------*/,{ 1373 /* 1374 * Send the M_X_WIDE_REQ 1375 */ 1376 SCR_MOVE_ABS (4) ^ SCR_MSG_OUT, 1377 HADDR_1 (msgout), 1378 SCR_JUMP, 1379 PADDR_B (msg_out_done), 1380 }/*-------------------------< SDTR_RESP >------------------------*/,{ 1381 /* 1382 * let the target fetch our answer. 1383 */ 1384 SCR_SET (SCR_ATN), 1385 0, 1386 SCR_CLR (SCR_ACK), 1387 0, 1388 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), 1389 PADDR_B (nego_bad_phase), 1390 }/*-------------------------< SEND_SDTR >------------------------*/,{ 1391 /* 1392 * Send the M_X_SYNC_REQ 1393 */ 1394 SCR_MOVE_ABS (5) ^ SCR_MSG_OUT, 1395 HADDR_1 (msgout), 1396 SCR_JUMP, 1397 PADDR_B (msg_out_done), 1398 }/*-------------------------< PPR_RESP >-------------------------*/,{ 1399 /* 1400 * let the target fetch our answer. 1401 */ 1402 SCR_SET (SCR_ATN), 1403 0, 1404 SCR_CLR (SCR_ACK), 1405 0, 1406 SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), 1407 PADDR_B (nego_bad_phase), 1408 }/*-------------------------< SEND_PPR >-------------------------*/,{ 1409 /* 1410 * Send the M_X_PPR_REQ 1411 */ 1412 SCR_MOVE_ABS (8) ^ SCR_MSG_OUT, 1413 HADDR_1 (msgout), 1414 SCR_JUMP, 1415 PADDR_B (msg_out_done), 1416 }/*-------------------------< NEGO_BAD_PHASE >-------------------*/,{ 1417 SCR_INT, 1418 SIR_NEGO_PROTO, 1419 SCR_JUMP, 1420 PADDR_A (dispatch), 1421 }/*-------------------------< MSG_OUT >--------------------------*/,{ 1422 /* 1423 * The target requests a message. 1424 * We donnot send messages that may 1425 * require the device to go to bus free. 1426 */ 1427 SCR_MOVE_ABS (1) ^ SCR_MSG_OUT, 1428 HADDR_1 (msgout), 1429 /* 1430 * ... wait for the next phase 1431 * if it's a message out, send it again, ... 1432 */ 1433 SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)), 1434 PADDR_B (msg_out), 1435 }/*-------------------------< MSG_OUT_DONE >---------------------*/,{ 1436 /* 1437 * Let the C code be aware of the 1438 * sent message and clear the message. 1439 */ 1440 SCR_INT, 1441 SIR_MSG_OUT_DONE, 1442 /* 1443 * ... and process the next phase 1444 */ 1445 SCR_JUMP, 1446 PADDR_A (dispatch), 1447 }/*-------------------------< DATA_OVRUN >-----------------------*/,{ 1448 /* 1449 * Use scratcha to count the extra bytes. 1450 */ 1451 SCR_LOAD_ABS (scratcha, 4), 1452 PADDR_B (zero), 1453 }/*-------------------------< DATA_OVRUN1 >----------------------*/,{ 1454 /* 1455 * The target may want to transfer too much data. 1456 * 1457 * If phase is DATA OUT write 1 byte and count it. 1458 */ 1459 SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)), 1460 16, 1461 SCR_CHMOV_ABS (1) ^ SCR_DATA_OUT, 1462 HADDR_1 (scratch), 1463 SCR_JUMP, 1464 PADDR_B (data_ovrun2), 1465 /* 1466 * If WSR is set, clear this condition, and 1467 * count this byte. 1468 */ 1469 SCR_FROM_REG (scntl2), 1470 0, 1471 SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)), 1472 16, 1473 SCR_REG_REG (scntl2, SCR_OR, WSR), 1474 0, 1475 SCR_JUMP, 1476 PADDR_B (data_ovrun2), 1477 /* 1478 * Finally check against DATA IN phase. 1479 * Signal data overrun to the C code 1480 * and jump to dispatcher if not so. 1481 * Read 1 byte otherwise and count it. 1482 */ 1483 SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_IN)), 1484 16, 1485 SCR_INT, 1486 SIR_DATA_OVERRUN, 1487 SCR_JUMP, 1488 PADDR_A (dispatch), 1489 SCR_CHMOV_ABS (1) ^ SCR_DATA_IN, 1490 HADDR_1 (scratch), 1491 }/*-------------------------< DATA_OVRUN2 >----------------------*/,{ 1492 /* 1493 * Count this byte. 1494 * This will allow to return a negative 1495 * residual to user. 1496 */ 1497 SCR_REG_REG (scratcha, SCR_ADD, 0x01), 1498 0, 1499 SCR_REG_REG (scratcha1, SCR_ADDC, 0), 1500 0, 1501 SCR_REG_REG (scratcha2, SCR_ADDC, 0), 1502 0, 1503 /* 1504 * .. and repeat as required. 1505 */ 1506 SCR_JUMP, 1507 PADDR_B (data_ovrun1), 1508 }/*-------------------------< ABORT_RESEL >----------------------*/,{ 1509 SCR_SET (SCR_ATN), 1510 0, 1511 SCR_CLR (SCR_ACK), 1512 0, 1513 /* 1514 * send the abort/abortag/reset message 1515 * we expect an immediate disconnect 1516 */ 1517 SCR_REG_REG (scntl2, SCR_AND, 0x7f), 1518 0, 1519 SCR_MOVE_ABS (1) ^ SCR_MSG_OUT, 1520 HADDR_1 (msgout), 1521 SCR_CLR (SCR_ACK|SCR_ATN), 1522 0, 1523 SCR_WAIT_DISC, 1524 0, 1525 SCR_INT, 1526 SIR_RESEL_ABORTED, 1527 SCR_JUMP, 1528 PADDR_A (start), 1529 }/*-------------------------< RESEND_IDENT >---------------------*/,{ 1530 /* 1531 * The target stays in MSG OUT phase after having acked 1532 * Identify [+ Tag [+ Extended message ]]. Targets shall 1533 * behave this way on parity error. 1534 * We must send it again all the messages. 1535 */ 1536 SCR_SET (SCR_ATN), /* Shall be asserted 2 deskew delays before the */ 1537 0, /* 1rst ACK = 90 ns. Hope the chip isn't too fast */ 1538 SCR_JUMP, 1539 PADDR_A (send_ident), 1540 }/*-------------------------< IDENT_BREAK >----------------------*/,{ 1541 SCR_CLR (SCR_ATN), 1542 0, 1543 SCR_JUMP, 1544 PADDR_A (select2), 1545 }/*-------------------------< IDENT_BREAK_ATN >------------------*/,{ 1546 SCR_SET (SCR_ATN), 1547 0, 1548 SCR_JUMP, 1549 PADDR_A (select2), 1550 }/*-------------------------< SDATA_IN >-------------------------*/,{ 1551 SCR_CHMOV_TBL ^ SCR_DATA_IN, 1552 offsetof (struct sym_dsb, sense), 1553 SCR_CALL, 1554 PADDR_A (datai_done), 1555 SCR_JUMP, 1556 PADDR_B (data_ovrun), 1557 }/*-------------------------< RESEL_BAD_LUN >--------------------*/,{ 1558 /* 1559 * Message is an IDENTIFY, but lun is unknown. 1560 * Signal problem to C code for logging the event. 1561 * Send a M_ABORT to clear all pending tasks. 1562 */ 1563 SCR_INT, 1564 SIR_RESEL_BAD_LUN, 1565 SCR_JUMP, 1566 PADDR_B (abort_resel), 1567 }/*-------------------------< BAD_I_T_L >------------------------*/,{ 1568 /* 1569 * We donnot have a task for that I_T_L. 1570 * Signal problem to C code for logging the event. 1571 * Send a M_ABORT message. 1572 */ 1573 SCR_INT, 1574 SIR_RESEL_BAD_I_T_L, 1575 SCR_JUMP, 1576 PADDR_B (abort_resel), 1577 }/*-------------------------< BAD_I_T_L_Q >----------------------*/,{ 1578 /* 1579 * We donnot have a task that matches the tag. 1580 * Signal problem to C code for logging the event. 1581 * Send a M_ABORTTAG message. 1582 */ 1583 SCR_INT, 1584 SIR_RESEL_BAD_I_T_L_Q, 1585 SCR_JUMP, 1586 PADDR_B (abort_resel), 1587 }/*-------------------------< BAD_STATUS >-----------------------*/,{ 1588 /* 1589 * Anything different from INTERMEDIATE 1590 * CONDITION MET should be a bad SCSI status, 1591 * given that GOOD status has already been tested. 1592 * Call the C code. 1593 */ 1594 SCR_LOAD_ABS (scratcha, 4), 1595 PADDR_B (startpos), 1596 SCR_INT ^ IFFALSE (DATA (S_COND_MET)), 1597 SIR_BAD_SCSI_STATUS, 1598 SCR_RETURN, 1599 0, 1600 }/*-------------------------< PM_HANDLE >------------------------*/,{ 1601 /* 1602 * Phase mismatch handling. 1603 * 1604 * Since we have to deal with 2 SCSI data pointers 1605 * (current and saved), we need at least 2 contexts. 1606 * Each context (pm0 and pm1) has a saved area, a 1607 * SAVE mini-script and a DATA phase mini-script. 1608 */ 1609 /* 1610 * Get the PM handling flags. 1611 */ 1612 SCR_FROM_REG (HF_REG), 1613 0, 1614 /* 1615 * If no flags (1rst PM for example), avoid 1616 * all the below heavy flags testing. 1617 * This makes the normal case a bit faster. 1618 */ 1619 SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED))), 1620 PADDR_B (pm_handle1), 1621 /* 1622 * If we received a SAVE DP, switch to the 1623 * other PM context since the savep may point 1624 * to the current PM context. 1625 */ 1626 SCR_JUMPR ^ IFFALSE (MASK (HF_DP_SAVED, HF_DP_SAVED)), 1627 8, 1628 SCR_REG_REG (sfbr, SCR_XOR, HF_ACT_PM), 1629 0, 1630 /* 1631 * If we have been interrupt in a PM DATA mini-script, 1632 * we take the return address from the corresponding 1633 * saved area. 1634 * This ensure the return address always points to the 1635 * main DATA script for this transfer. 1636 */ 1637 SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1))), 1638 PADDR_B (pm_handle1), 1639 SCR_JUMPR ^ IFFALSE (MASK (HF_IN_PM0, HF_IN_PM0)), 1640 16, 1641 SCR_LOAD_REL (ia, 4), 1642 offsetof(struct sym_ccb, phys.pm0.ret), 1643 SCR_JUMP, 1644 PADDR_B (pm_save), 1645 SCR_LOAD_REL (ia, 4), 1646 offsetof(struct sym_ccb, phys.pm1.ret), 1647 SCR_JUMP, 1648 PADDR_B (pm_save), 1649 }/*-------------------------< PM_HANDLE1 >-----------------------*/,{ 1650 /* 1651 * Normal case. 1652 * Update the return address so that it 1653 * will point after the interrupted MOVE. 1654 */ 1655 SCR_REG_REG (ia, SCR_ADD, 8), 1656 0, 1657 SCR_REG_REG (ia1, SCR_ADDC, 0), 1658 0, 1659 }/*-------------------------< PM_SAVE >--------------------------*/,{ 1660 /* 1661 * Clear all the flags that told us if we were 1662 * interrupted in a PM DATA mini-script and/or 1663 * we received a SAVE DP. 1664 */ 1665 SCR_SFBR_REG (HF_REG, SCR_AND, (~(HF_IN_PM0|HF_IN_PM1|HF_DP_SAVED))), 1666 0, 1667 /* 1668 * Choose the current PM context. 1669 */ 1670 SCR_JUMP ^ IFTRUE (MASK (HF_ACT_PM, HF_ACT_PM)), 1671 PADDR_B (pm1_save), 1672 }/*-------------------------< PM0_SAVE >-------------------------*/,{ 1673 SCR_STORE_REL (ia, 4), 1674 offsetof(struct sym_ccb, phys.pm0.ret), 1675 /* 1676 * If WSR bit is set, either UA and RBC may 1677 * have to be changed whether the device wants 1678 * to ignore this residue or not. 1679 */ 1680 SCR_FROM_REG (scntl2), 1681 0, 1682 SCR_CALL ^ IFTRUE (MASK (WSR, WSR)), 1683 PADDR_B (pm_wsr_handle), 1684 /* 1685 * Save the remaining byte count, the updated 1686 * address and the return address. 1687 */ 1688 SCR_STORE_REL (rbc, 4), 1689 offsetof(struct sym_ccb, phys.pm0.sg.size), 1690 SCR_STORE_REL (ua, 4), 1691 offsetof(struct sym_ccb, phys.pm0.sg.addr), 1692 /* 1693 * Set the current pointer at the PM0 DATA mini-script. 1694 */ 1695 SCR_LOAD_ABS (temp, 4), 1696 PADDR_B (pm0_data_addr), 1697 SCR_JUMP, 1698 PADDR_A (dispatch), 1699 }/*-------------------------< PM1_SAVE >-------------------------*/,{ 1700 SCR_STORE_REL (ia, 4), 1701 offsetof(struct sym_ccb, phys.pm1.ret), 1702 /* 1703 * If WSR bit is set, either UA and RBC may 1704 * have to be changed whether the device wants 1705 * to ignore this residue or not. 1706 */ 1707 SCR_FROM_REG (scntl2), 1708 0, 1709 SCR_CALL ^ IFTRUE (MASK (WSR, WSR)), 1710 PADDR_B (pm_wsr_handle), 1711 /* 1712 * Save the remaining byte count, the updated 1713 * address and the return address. 1714 */ 1715 SCR_STORE_REL (rbc, 4), 1716 offsetof(struct sym_ccb, phys.pm1.sg.size), 1717 SCR_STORE_REL (ua, 4), 1718 offsetof(struct sym_ccb, phys.pm1.sg.addr), 1719 /* 1720 * Set the current pointer at the PM1 DATA mini-script. 1721 */ 1722 SCR_LOAD_ABS (temp, 4), 1723 PADDR_B (pm1_data_addr), 1724 SCR_JUMP, 1725 PADDR_A (dispatch), 1726 }/*-------------------------< PM_WSR_HANDLE >--------------------*/,{ 1727 /* 1728 * Phase mismatch handling from SCRIPT with WSR set. 1729 * Such a condition can occur if the chip wants to 1730 * execute a CHMOV(size > 1) when the WSR bit is 1731 * set and the target changes PHASE. 1732 * 1733 * We must move the residual byte to memory. 1734 * 1735 * UA contains bit 0..31 of the address to 1736 * move the residual byte. 1737 * Move it to the table indirect. 1738 */ 1739 SCR_STORE_REL (ua, 4), 1740 offsetof (struct sym_ccb, phys.wresid.addr), 1741 /* 1742 * Increment UA (move address to next position). 1743 */ 1744 SCR_REG_REG (ua, SCR_ADD, 1), 1745 0, 1746 SCR_REG_REG (ua1, SCR_ADDC, 0), 1747 0, 1748 SCR_REG_REG (ua2, SCR_ADDC, 0), 1749 0, 1750 SCR_REG_REG (ua3, SCR_ADDC, 0), 1751 0, 1752 /* 1753 * Compute SCRATCHA as: 1754 * - size to transfer = 1 byte. 1755 * - bit 24..31 = high address bit [32...39]. 1756 */ 1757 SCR_LOAD_ABS (scratcha, 4), 1758 PADDR_B (zero), 1759 SCR_REG_REG (scratcha, SCR_OR, 1), 1760 0, 1761 SCR_FROM_REG (rbc3), 1762 0, 1763 SCR_TO_REG (scratcha3), 1764 0, 1765 /* 1766 * Move this value to the table indirect. 1767 */ 1768 SCR_STORE_REL (scratcha, 4), 1769 offsetof (struct sym_ccb, phys.wresid.size), 1770 /* 1771 * Wait for a valid phase. 1772 * While testing with bogus QUANTUM drives, the C1010 1773 * sometimes raised a spurious phase mismatch with 1774 * WSR and the CHMOV(1) triggered another PM. 1775 * Waiting explicitely for the PHASE seemed to avoid 1776 * the nested phase mismatch. Btw, this didn't happen 1777 * using my IBM drives. 1778 */ 1779 SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_IN)), 1780 0, 1781 /* 1782 * Perform the move of the residual byte. 1783 */ 1784 SCR_CHMOV_TBL ^ SCR_DATA_IN, 1785 offsetof (struct sym_ccb, phys.wresid), 1786 /* 1787 * We can now handle the phase mismatch with UA fixed. 1788 * RBC[0..23]=0 is a special case that does not require 1789 * a PM context. The C code also checks against this. 1790 */ 1791 SCR_FROM_REG (rbc), 1792 0, 1793 SCR_RETURN ^ IFFALSE (DATA (0)), 1794 0, 1795 SCR_FROM_REG (rbc1), 1796 0, 1797 SCR_RETURN ^ IFFALSE (DATA (0)), 1798 0, 1799 SCR_FROM_REG (rbc2), 1800 0, 1801 SCR_RETURN ^ IFFALSE (DATA (0)), 1802 0, 1803 /* 1804 * RBC[0..23]=0. 1805 * Not only we donnot need a PM context, but this would 1806 * lead to a bogus CHMOV(0). This condition means that 1807 * the residual was the last byte to move from this CHMOV. 1808 * So, we just have to move the current data script pointer 1809 * (i.e. TEMP) to the SCRIPTS address following the 1810 * interrupted CHMOV and jump to dispatcher. 1811 */ 1812 SCR_STORE_ABS (ia, 4), 1813 PADDR_B (scratch), 1814 SCR_LOAD_ABS (temp, 4), 1815 PADDR_B (scratch), 1816 SCR_JUMP, 1817 PADDR_A (dispatch), 1818 }/*-------------------------< WSR_MA_HELPER >--------------------*/,{ 1819 /* 1820 * Helper for the C code when WSR bit is set. 1821 * Perform the move of the residual byte. 1822 */ 1823 SCR_CHMOV_TBL ^ SCR_DATA_IN, 1824 offsetof (struct sym_ccb, phys.wresid), 1825 SCR_JUMP, 1826 PADDR_A (dispatch), 1827 }/*-------------------------< ZERO >-----------------------------*/,{ 1828 SCR_DATA_ZERO, 1829 }/*-------------------------< SCRATCH >--------------------------*/,{ 1830 SCR_DATA_ZERO, 1831 }/*-------------------------< PM0_DATA_ADDR >--------------------*/,{ 1832 SCR_DATA_ZERO, 1833 }/*-------------------------< PM1_DATA_ADDR >--------------------*/,{ 1834 SCR_DATA_ZERO, 1835 }/*-------------------------< SAVED_DSA >------------------------*/,{ 1836 SCR_DATA_ZERO, 1837 }/*-------------------------< SAVED_DRS >------------------------*/,{ 1838 SCR_DATA_ZERO, 1839 }/*-------------------------< DONE_POS >-------------------------*/,{ 1840 SCR_DATA_ZERO, 1841 }/*-------------------------< STARTPOS >-------------------------*/,{ 1842 SCR_DATA_ZERO, 1843 }/*-------------------------< TARGTBL >--------------------------*/,{ 1844 SCR_DATA_ZERO, 1845 1846 }/*-------------------------< SNOOPTEST >------------------------*/,{ 1847 /* 1848 * Read the variable from memory. 1849 */ 1850 SCR_LOAD_REL (scratcha, 4), 1851 offsetof(struct sym_hcb, cache), 1852 /* 1853 * Write the variable to memory. 1854 */ 1855 SCR_STORE_REL (temp, 4), 1856 offsetof(struct sym_hcb, cache), 1857 /* 1858 * Read back the variable from memory. 1859 */ 1860 SCR_LOAD_REL (temp, 4), 1861 offsetof(struct sym_hcb, cache), 1862 }/*-------------------------< SNOOPEND >-------------------------*/,{ 1863 /* 1864 * And stop. 1865 */ 1866 SCR_INT, 1867 99, 1868 }/*-------------------------<>-----------------------------------*/ 1869 }; 1870