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