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