53c8xx_d.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:59k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* DO NOT EDIT - Generated automatically by script_asm.pl */
  2. static u32 SCRIPT[] = {
  3. /*
  4. ; NCR 53c810 driver, main script
  5. ; Sponsored by 
  6. ; iX Multiuser Multitasking Magazine
  7. ; hm@ix.de
  8. ;
  9. ; Copyright 1993, 1994, 1995 Drew Eckhardt
  10. ;      Visionary Computing 
  11. ;      (Unix and Linux consulting and custom programming)
  12. ;      drew@PoohSticks.ORG
  13. ;      +1 (303) 786-7975
  14. ;
  15. ; TolerANT and SCSI SCRIPTS are registered trademarks of NCR Corporation.
  16. ;
  17. ; PRE-ALPHA
  18. ;
  19. ; For more information, please consult 
  20. ;
  21. ; NCR 53C810
  22. ; PCI-SCSI I/O Processor
  23. ; Data Manual
  24. ;
  25. ; NCR 53C710 
  26. ; SCSI I/O Processor
  27. ; Programmers Guide
  28. ;
  29. ; NCR Microelectronics
  30. ; 1635 Aeroplaza Drive
  31. ; Colorado Springs, CO 80916
  32. ; 1+ (719) 578-3400
  33. ;
  34. ; Toll free literature number
  35. ; +1 (800) 334-5454
  36. ;
  37. ; IMPORTANT : This code is self modifying due to the limitations of 
  38. ; the NCR53c7,8xx series chips.  Persons debugging this code with
  39. ; the remote debugger should take this into account, and NOT set
  40. ; breakpoints in modified instructions.
  41. ;
  42. ; Design:
  43. ; The NCR53c7,8xx family of SCSI chips are busmasters with an onboard 
  44. ; microcontroller using a simple instruction set.   
  45. ;
  46. ; So, to minimize the effects of interrupt latency, and to maximize 
  47. ; throughput, this driver offloads the practical maximum amount 
  48. ; of processing to the SCSI chip while still maintaining a common
  49. ; structure.
  50. ;
  51. ; Where tradeoffs were needed between efficiency on the older
  52. ; chips and the newer NCR53c800 series, the NCR53c800 series 
  53. ; was chosen.
  54. ;
  55. ; While the NCR53c700 and NCR53c700-66 lacked the facilities to fully
  56. ; automate SCSI transfers without host processor intervention, this 
  57. ; isn't the case with the NCR53c710 and newer chips which allow 
  58. ;
  59. ; - reads and writes to the internal registers from within the SCSI
  60. ;  scripts, allowing the SCSI SCRIPTS(tm) code to save processor
  61. ;  state so that multiple threads of execution are possible, and also
  62. ;  provide an ALU for loop control, etc.
  63. ; - table indirect addressing for some instructions. This allows 
  64. ; pointers to be located relative to the DSA ((Data Structure
  65. ; Address) register.
  66. ;
  67. ; These features make it possible to implement a mailbox style interface,
  68. ; where the same piece of code is run to handle I/O for multiple threads
  69. ; at once minimizing our need to relocate code.  Since the NCR53c700/
  70. ; NCR53c800 series have a unique combination of features, making a 
  71. ; a standard ingoing/outgoing mailbox system, costly, I've modified it.
  72. ;
  73. ; - Mailboxes are a mixture of code and data.  This lets us greatly
  74. ;  simplify the NCR53c810 code and do things that would otherwise
  75. ; not be possible.
  76. ;
  77. ; The saved data pointer is now implemented as follows :
  78. ;
  79. ;  Control flow has been architected such that if control reaches
  80. ; munge_save_data_pointer, on a restore pointers message or 
  81. ; reconnection, a jump to the address formerly in the TEMP register
  82. ; will allow the SCSI command to resume execution.
  83. ;
  84. ;
  85. ; Note : the DSA structures must be aligned on 32 bit boundaries,
  86. ; since the source and destination of MOVE MEMORY instructions 
  87. ; must share the same alignment and this is the alignment of the
  88. ; NCR registers.
  89. ;
  90. ABSOLUTE dsa_temp_lun = 0 ; Patch to lun for current dsa
  91. ABSOLUTE dsa_temp_next = 0 ; Patch to dsa next for current dsa
  92. ABSOLUTE dsa_temp_addr_next = 0 ; Patch to address of dsa next address 
  93. ;  for current dsa
  94. ABSOLUTE dsa_temp_sync = 0 ; Patch to address of per-target
  95. ; sync routine
  96. ABSOLUTE dsa_temp_target = 0 ; Patch to id for current dsa
  97. ABSOLUTE dsa_temp_addr_saved_pointer = 0; Patch to address of per-command
  98. ;  saved data pointer
  99. ABSOLUTE dsa_temp_addr_residual = 0 ; Patch to address of per-command
  100. ; current residual code
  101. ABSOLUTE dsa_temp_addr_saved_residual = 0; Patch to address of per-command
  102. ; saved residual code
  103. ABSOLUTE dsa_temp_addr_new_value = 0 ; Address of value for JUMP operand
  104. ABSOLUTE dsa_temp_addr_array_value = 0  ; Address to copy to
  105. ABSOLUTE dsa_temp_addr_dsa_value = 0 ; Address of this DSA value
  106. ;
  107. ; Once a device has initiated reselection, we need to compare it 
  108. ; against the singly linked list of commands which have disconnected
  109. ; and are pending reselection.  These commands are maintained in 
  110. ; an unordered singly linked list of DSA structures, through the
  111. ; DSA pointers at their 'centers' headed by the reconnect_dsa_head
  112. ; pointer.
  113. ; To avoid complications in removing commands from the list,
  114. ; I minimize the amount of expensive (at eight operations per
  115. ; addition @ 500-600ns each) pointer operations which must
  116. ; be done in the NCR driver by precomputing them on the 
  117. ; host processor during dsa structure generation.
  118. ;
  119. ; The fixed-up per DSA code knows how to recognize the nexus
  120. ; associated with the corresponding SCSI command, and modifies
  121. ; the source and destination pointers for the MOVE MEMORY 
  122. ; instruction which is executed when reselected_ok is called
  123. ; to remove the command from the list.  Similarly, DSA is 
  124. ; loaded with the address of the next DSA structure and
  125. ; reselected_check_next is called if a failure occurs.
  126. ;
  127. ; Perhaps more concisely, the net effect of the mess is 
  128. ;
  129. ; for (dsa = reconnect_dsa_head, dest = &reconnect_dsa_head, 
  130. ;     src = NULL; dsa; dest = &dsa->next, dsa = dsa->next) {
  131. ;  src = &dsa->next;
  132. ;  if (target_id == dsa->id && target_lun == dsa->lun) {
  133. ;  *dest = *src;
  134. ;  break;
  135. ;         }
  136. ; }
  137. ;
  138. ; if (!dsa)
  139. ;           error (int_err_unexpected_reselect);
  140. ; else  
  141. ;     longjmp (dsa->jump_resume, 0);
  142. ;
  143. ; Define DSA structure used for mailboxes
  144. ENTRY dsa_code_template
  145. dsa_code_template:
  146. ENTRY dsa_code_begin
  147. dsa_code_begin:
  148. MOVE dmode_memory_to_ncr TO DMODE
  149. at 0x00000000 : */ 0x78380000,0x00000000,
  150. /*
  151. MOVE MEMORY 4, dsa_temp_addr_dsa_value, addr_scratch
  152. at 0x00000002 : */ 0xc0000004,0x00000000,0x00000000,
  153. /*
  154. MOVE dmode_memory_to_memory TO DMODE
  155. at 0x00000005 : */ 0x78380000,0x00000000,
  156. /*
  157. CALL scratch_to_dsa
  158. at 0x00000007 : */ 0x88080000,0x00000980,
  159. /*
  160. CALL select
  161. at 0x00000009 : */ 0x88080000,0x000001fc,
  162. /*
  163. ; Handle the phase mismatch which may have resulted from the 
  164. ; MOVE FROM dsa_msgout if we returned here.  The CLEAR ATN 
  165. ; may or may not be necessary, and we should update script_asm.pl
  166. ; to handle multiple pieces.
  167.     CLEAR ATN
  168. at 0x0000000b : */ 0x60000008,0x00000000,
  169. /*
  170.     CLEAR ACK
  171. at 0x0000000d : */ 0x60000040,0x00000000,
  172. /*
  173. ; Replace second operand with address of JUMP instruction dest operand
  174. ; in schedule table for this DSA.  Becomes dsa_jump_dest in 53c7,8xx.c.
  175. ENTRY dsa_code_fix_jump
  176. dsa_code_fix_jump:
  177. MOVE MEMORY 4, NOP_insn, 0
  178. at 0x0000000f : */ 0xc0000004,0x00000000,0x00000000,
  179. /*
  180. JUMP select_done
  181. at 0x00000012 : */ 0x80080000,0x00000224,
  182. /*
  183. ; wrong_dsa loads the DSA register with the value of the dsa_next
  184. ; field.
  185. ;
  186. wrong_dsa:
  187. ; Patch the MOVE MEMORY INSTRUCTION such that 
  188. ; the destination address is the address of the OLD 
  189. ; next pointer.
  190. ;
  191. MOVE MEMORY 4, dsa_temp_addr_next, reselected_ok + 8
  192. at 0x00000014 : */ 0xc0000004,0x00000000,0x00000758,
  193. /*
  194. MOVE dmode_memory_to_ncr TO DMODE
  195. at 0x00000017 : */ 0x78380000,0x00000000,
  196. /*
  197. ;
  198. ;  Move the _contents_ of the next pointer into the DSA register as 
  199. ; the next I_T_L or I_T_L_Q tupple to check against the established
  200. ; nexus.
  201. ;
  202. MOVE MEMORY 4, dsa_temp_next, addr_scratch
  203. at 0x00000019 : */ 0xc0000004,0x00000000,0x00000000,
  204. /*
  205. MOVE dmode_memory_to_memory TO DMODE
  206. at 0x0000001c : */ 0x78380000,0x00000000,
  207. /*
  208. CALL scratch_to_dsa
  209. at 0x0000001e : */ 0x88080000,0x00000980,
  210. /*
  211. JUMP reselected_check_next
  212. at 0x00000020 : */ 0x80080000,0x000006a4,
  213. /*
  214. ABSOLUTE dsa_save_data_pointer = 0
  215. ENTRY dsa_code_save_data_pointer
  216. dsa_code_save_data_pointer:
  217.      MOVE dmode_ncr_to_memory TO DMODE
  218. at 0x00000022 : */ 0x78380000,0x00000000,
  219. /*
  220.      MOVE MEMORY 4, addr_temp, dsa_temp_addr_saved_pointer
  221. at 0x00000024 : */ 0xc0000004,0x00000000,0x00000000,
  222. /*
  223.      MOVE dmode_memory_to_memory TO DMODE
  224. at 0x00000027 : */ 0x78380000,0x00000000,
  225. /*
  226. ; HARD CODED : 24 bytes needs to agree with 53c7,8xx.h
  227.      MOVE MEMORY 24, dsa_temp_addr_residual, dsa_temp_addr_saved_residual
  228. at 0x00000029 : */ 0xc0000018,0x00000000,0x00000000,
  229. /*
  230.         CLEAR ACK
  231. at 0x0000002c : */ 0x60000040,0x00000000,
  232. /*
  233.      RETURN
  234. at 0x0000002e : */ 0x90080000,0x00000000,
  235. /*
  236. ABSOLUTE dsa_restore_pointers = 0
  237. ENTRY dsa_code_restore_pointers
  238. dsa_code_restore_pointers:
  239.      MOVE dmode_memory_to_ncr TO DMODE
  240. at 0x00000030 : */ 0x78380000,0x00000000,
  241. /*
  242.      MOVE MEMORY 4, dsa_temp_addr_saved_pointer, addr_temp
  243. at 0x00000032 : */ 0xc0000004,0x00000000,0x00000000,
  244. /*
  245.      MOVE dmode_memory_to_memory TO DMODE
  246. at 0x00000035 : */ 0x78380000,0x00000000,
  247. /*
  248. ; HARD CODED : 24 bytes needs to agree with 53c7,8xx.h
  249.      MOVE MEMORY 24, dsa_temp_addr_saved_residual, dsa_temp_addr_residual
  250. at 0x00000037 : */ 0xc0000018,0x00000000,0x00000000,
  251. /*
  252.         CLEAR ACK
  253. at 0x0000003a : */ 0x60000040,0x00000000,
  254. /*
  255.      RETURN
  256. at 0x0000003c : */ 0x90080000,0x00000000,
  257. /*
  258. ABSOLUTE dsa_check_reselect = 0
  259. ; dsa_check_reselect determines whether or not the current target and
  260. ; lun match the current DSA
  261. ENTRY dsa_code_check_reselect
  262. dsa_code_check_reselect:
  263. MOVE SSID TO SFBR ; SSID contains 3 bit target ID
  264. at 0x0000003e : */ 0x720a0000,0x00000000,
  265. /*
  266. ; FIXME : we need to accommodate bit fielded and binary here for '7xx/'8xx chips
  267. JUMP REL (wrong_dsa), IF NOT dsa_temp_target, AND MASK 0xf8
  268. at 0x00000040 : */ 0x8084f800,0x00ffff48,
  269. /*
  270. ;
  271. ; Hack - move to scratch first, since SFBR is not writeable
  272. ;  via the CPU and hence a MOVE MEMORY instruction.
  273. ;
  274. MOVE dmode_memory_to_ncr TO DMODE
  275. at 0x00000042 : */ 0x78380000,0x00000000,
  276. /*
  277. MOVE MEMORY 1, reselected_identify, addr_scratch
  278. at 0x00000044 : */ 0xc0000001,0x00000000,0x00000000,
  279. /*
  280. MOVE dmode_memory_to_memory TO DMODE
  281. at 0x00000047 : */ 0x78380000,0x00000000,
  282. /*
  283. MOVE SCRATCH0 TO SFBR
  284. at 0x00000049 : */ 0x72340000,0x00000000,
  285. /*
  286. ; FIXME : we need to accommodate bit fielded and binary here for '7xx/'8xx chips
  287. JUMP REL (wrong_dsa), IF NOT dsa_temp_lun, AND MASK 0xf8
  288. at 0x0000004b : */ 0x8084f800,0x00ffff1c,
  289. /*
  290. ; Patch the MOVE MEMORY INSTRUCTION such that
  291. ; the source address is the address of this dsa's
  292. ; next pointer.
  293. MOVE MEMORY 4, dsa_temp_addr_next, reselected_ok + 4
  294. at 0x0000004d : */ 0xc0000004,0x00000000,0x00000754,
  295. /*
  296. CALL reselected_ok
  297. at 0x00000050 : */ 0x88080000,0x00000750,
  298. /*
  299. CALL dsa_temp_sync
  300. at 0x00000052 : */ 0x88080000,0x00000000,
  301. /*
  302. ; Release ACK on the IDENTIFY message _after_ we've set the synchronous 
  303. ; transfer parameters! 
  304. CLEAR ACK
  305. at 0x00000054 : */ 0x60000040,0x00000000,
  306. /*
  307. ; Implicitly restore pointers on reselection, so a RETURN
  308. ; will transfer control back to the right spot.
  309.      CALL REL (dsa_code_restore_pointers)
  310. at 0x00000056 : */ 0x88880000,0x00ffff60,
  311. /*
  312.      RETURN
  313. at 0x00000058 : */ 0x90080000,0x00000000,
  314. /*
  315. ENTRY dsa_zero
  316. dsa_zero:
  317. ENTRY dsa_code_template_end
  318. dsa_code_template_end:
  319. ; Perform sanity check for dsa_fields_start == dsa_code_template_end - 
  320. ; dsa_zero, puke.
  321. ABSOLUTE dsa_fields_start =  0 ; Sanity marker
  322. ;  pad 48 bytes (fix this RSN)
  323. ABSOLUTE dsa_next = 48 ; len 4 Next DSA
  324.   ; del 4 Previous DSA address
  325. ABSOLUTE dsa_cmnd = 56 ; len 4 Scsi_Cmnd * for this thread.
  326. ABSOLUTE dsa_select = 60 ; len 4 Device ID, Period, Offset for 
  327.   ; table indirect select
  328. ABSOLUTE dsa_msgout = 64 ; len 8 table indirect move parameter for 
  329. ;       select message
  330. ABSOLUTE dsa_cmdout = 72 ; len 8 table indirect move parameter for 
  331. ; command
  332. ABSOLUTE dsa_dataout = 80 ; len 4 code pointer for dataout
  333. ABSOLUTE dsa_datain = 84 ; len 4 code pointer for datain
  334. ABSOLUTE dsa_msgin = 88 ; len 8 table indirect move for msgin
  335. ABSOLUTE dsa_status = 96  ; len 8 table indirect move for status byte
  336. ABSOLUTE dsa_msgout_other = 104 ; len 8 table indirect for normal message out
  337. ; (Synchronous transfer negotiation, etc).
  338. ABSOLUTE dsa_end = 112
  339. ABSOLUTE schedule = 0  ; Array of JUMP dsa_begin or JUMP (next),
  340. ; terminated by a call to JUMP wait_reselect
  341. ; Linked lists of DSA structures
  342. ABSOLUTE reconnect_dsa_head = 0 ; Link list of DSAs which can reconnect
  343. ABSOLUTE addr_reconnect_dsa_head = 0 ; Address of variable containing
  344. ; address of reconnect_dsa_head
  345. ; These select the source and destination of a MOVE MEMORY instruction
  346. ABSOLUTE dmode_memory_to_memory = 0x0
  347. ABSOLUTE dmode_memory_to_ncr = 0x0
  348. ABSOLUTE dmode_ncr_to_memory = 0x0
  349. ABSOLUTE addr_scratch = 0x0
  350. ABSOLUTE addr_temp = 0x0
  351. ; Interrupts - 
  352. ; MSB indicates type
  353. ; 0 handle error condition
  354. ; 1  handle message 
  355. ; 2  handle normal condition
  356. ; 3 debugging interrupt
  357. ; 4  testing interrupt 
  358. ; Next byte indicates specific error
  359. ; XXX not yet implemented, I'm not sure if I want to - 
  360. ; Next byte indicates the routine the error occurred in
  361. ; The LSB indicates the specific place the error occurred
  362.  
  363. ABSOLUTE int_err_unexpected_phase = 0x00000000 ; Unexpected phase encountered
  364. ABSOLUTE int_err_selected = 0x00010000 ; SELECTED (nee RESELECTED)
  365. ABSOLUTE int_err_unexpected_reselect = 0x00020000 
  366. ABSOLUTE int_err_check_condition = 0x00030000
  367. ABSOLUTE int_err_no_phase = 0x00040000
  368. ABSOLUTE int_msg_wdtr = 0x01000000 ; WDTR message received
  369. ABSOLUTE int_msg_sdtr = 0x01010000 ; SDTR received
  370. ABSOLUTE int_msg_1 = 0x01020000 ; single byte special message
  371. ; received
  372. ABSOLUTE int_norm_select_complete = 0x02000000 ; Select complete, reprogram
  373. ; registers.
  374. ABSOLUTE int_norm_reselect_complete = 0x02010000 ; Nexus established
  375. ABSOLUTE int_norm_command_complete = 0x02020000 ; Command complete
  376. ABSOLUTE int_norm_disconnected = 0x02030000 ; Disconnected 
  377. ABSOLUTE int_norm_aborted =0x02040000 ; Aborted *dsa
  378. ABSOLUTE int_norm_reset = 0x02050000 ; Generated BUS reset.
  379. ABSOLUTE int_debug_break = 0x03000000 ; Break point
  380. ABSOLUTE int_debug_panic = 0x030b0000 ; Panic driver
  381. ABSOLUTE int_test_1 = 0x04000000 ; Test 1 complete
  382. ABSOLUTE int_test_2 = 0x04010000 ; Test 2 complete
  383. ABSOLUTE int_test_3 = 0x04020000 ; Test 3 complete
  384. ; These should start with 0x05000000, with low bits incrementing for 
  385. ; each one.
  386. ABSOLUTE NCR53c7xx_msg_abort = 0 ; Pointer to abort message
  387. ABSOLUTE NCR53c7xx_msg_reject = 0       ; Pointer to reject message
  388. ABSOLUTE NCR53c7xx_zero = 0 ; long with zero in it, use for source
  389. ABSOLUTE NCR53c7xx_sink = 0 ; long to dump worthless data in
  390. ABSOLUTE NOP_insn = 0 ; NOP instruction
  391. ; Pointer to message, potentially multi-byte
  392. ABSOLUTE msg_buf = 0
  393. ; Pointer to holding area for reselection information
  394. ABSOLUTE reselected_identify = 0
  395. ABSOLUTE reselected_tag = 0
  396. ; Request sense command pointer, it's a 6 byte command, should
  397. ; be constant for all commands since we always want 16 bytes of 
  398. ; sense and we don't need to change any fields as we did under 
  399. ; SCSI-I when we actually cared about the LUN field.
  400. ;EXTERNAL NCR53c7xx_sense ; Request sense command
  401. ; dsa_schedule  
  402. ; PURPOSE : after a DISCONNECT message has been received, and pointers
  403. ; saved, insert the current DSA structure at the head of the 
  404. ;  disconnected queue and fall through to the scheduler.
  405. ;
  406. ; CALLS : OK
  407. ;
  408. ; INPUTS : dsa - current DSA structure, reconnect_dsa_head - list
  409. ; of disconnected commands
  410. ;
  411. ; MODIFIES : SCRATCH, reconnect_dsa_head
  412. ; EXITS : always passes control to schedule
  413. ENTRY dsa_schedule
  414. dsa_schedule:
  415. ;
  416. ; Calculate the address of the next pointer within the DSA 
  417. ; structure of the command that is currently disconnecting
  418. ;
  419.     CALL dsa_to_scratch
  420. at 0x0000005a : */ 0x88080000,0x00000938,
  421. /*
  422.     MOVE SCRATCH0 + dsa_next TO SCRATCH0
  423. at 0x0000005c : */ 0x7e343000,0x00000000,
  424. /*
  425.     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY
  426. at 0x0000005e : */ 0x7f350000,0x00000000,
  427. /*
  428.     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY
  429. at 0x00000060 : */ 0x7f360000,0x00000000,
  430. /*
  431.     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY
  432. at 0x00000062 : */ 0x7f370000,0x00000000,
  433. /*
  434. ; Point the next field of this DSA structure at the current disconnected 
  435. ; list
  436.     MOVE dmode_ncr_to_memory TO DMODE
  437. at 0x00000064 : */ 0x78380000,0x00000000,
  438. /*
  439.     MOVE MEMORY 4, addr_scratch, dsa_schedule_insert + 8
  440. at 0x00000066 : */ 0xc0000004,0x00000000,0x000001b4,
  441. /*
  442.     MOVE dmode_memory_to_memory TO DMODE
  443. at 0x00000069 : */ 0x78380000,0x00000000,
  444. /*
  445. dsa_schedule_insert:
  446.     MOVE MEMORY 4, reconnect_dsa_head, 0 
  447. at 0x0000006b : */ 0xc0000004,0x00000000,0x00000000,
  448. /*
  449. ; And update the head pointer.
  450.     CALL dsa_to_scratch
  451. at 0x0000006e : */ 0x88080000,0x00000938,
  452. /*
  453.     MOVE dmode_ncr_to_memory TO DMODE
  454. at 0x00000070 : */ 0x78380000,0x00000000,
  455. /*
  456.     MOVE MEMORY 4, addr_scratch, reconnect_dsa_head
  457. at 0x00000072 : */ 0xc0000004,0x00000000,0x00000000,
  458. /*
  459.     MOVE dmode_memory_to_memory TO DMODE
  460. at 0x00000075 : */ 0x78380000,0x00000000,
  461. /*
  462.     MOVE SCNTL2 & 0x7f TO SCNTL2
  463. at 0x00000077 : */ 0x7c027f00,0x00000000,
  464. /*
  465.     CLEAR ACK
  466. at 0x00000079 : */ 0x60000040,0x00000000,
  467. /*
  468.     WAIT DISCONNECT
  469. at 0x0000007b : */ 0x48000000,0x00000000,
  470. /*
  471.     JUMP schedule
  472. at 0x0000007d : */ 0x80080000,0x00000000,
  473. /*
  474. ;
  475. ; select
  476. ;
  477. ; PURPOSE : establish a nexus for the SCSI command referenced by DSA.
  478. ; On success, the current DSA structure is removed from the issue 
  479. ; queue.  Usually, this is entered as a fall-through from schedule,
  480. ; although the contingent allegiance handling code will write
  481. ; the select entry address to the DSP to restart a command as a 
  482. ; REQUEST SENSE.  A message is sent (usually IDENTIFY, although
  483. ; additional SDTR or WDTR messages may be sent).  COMMAND OUT
  484. ; is handled.
  485. ;
  486. ; INPUTS : DSA - SCSI command, issue_dsa_head
  487. ;
  488. ; CALLS : NOT OK
  489. ;
  490. ; MODIFIES : SCRATCH, issue_dsa_head
  491. ;
  492. ; EXITS : on reselection or selection, go to select_failed
  493. ; otherwise, RETURN so control is passed back to 
  494. ; dsa_begin.
  495. ;
  496. ENTRY select
  497. select:
  498.     CLEAR TARGET
  499. at 0x0000007f : */ 0x60000200,0x00000000,
  500. /*
  501. ; XXX
  502. ;
  503. ; In effect, SELECTION operations are backgrounded, with execution
  504. ; continuing until code which waits for REQ or a fatal interrupt is 
  505. ; encountered.
  506. ;
  507. ; So, for more performance, we could overlap the code which removes 
  508. ; the command from the NCRs issue queue with the selection, but 
  509. ; at this point I don't want to deal with the error recovery.
  510. ;
  511.     SELECT ATN FROM dsa_select, select_failed
  512. at 0x00000081 : */ 0x4300003c,0x000007a4,
  513. /*
  514.     JUMP select_msgout, WHEN MSG_OUT
  515. at 0x00000083 : */ 0x860b0000,0x00000214,
  516. /*
  517. ENTRY select_msgout
  518. select_msgout:
  519.     MOVE FROM dsa_msgout, WHEN MSG_OUT
  520. at 0x00000085 : */ 0x1e000000,0x00000040,
  521. /*
  522.    RETURN
  523. at 0x00000087 : */ 0x90080000,0x00000000,
  524. /*
  525. ; select_done
  526. ; PURPOSE: continue on to normal data transfer; called as the exit 
  527. ; point from dsa_begin.
  528. ;
  529. ; INPUTS: dsa
  530. ;
  531. ; CALLS: OK
  532. ;
  533. ;
  534. select_done:
  535. ; After a successful selection, we should get either a CMD phase or 
  536. ; some transfer request negotiation message.
  537.     JUMP cmdout, WHEN CMD
  538. at 0x00000089 : */ 0x820b0000,0x00000244,
  539. /*
  540.     INT int_err_unexpected_phase, WHEN NOT MSG_IN 
  541. at 0x0000008b : */ 0x9f030000,0x00000000,
  542. /*
  543. select_msg_in:
  544.     CALL msg_in, WHEN MSG_IN
  545. at 0x0000008d : */ 0x8f0b0000,0x00000404,
  546. /*
  547.     JUMP select_msg_in, WHEN MSG_IN
  548. at 0x0000008f : */ 0x870b0000,0x00000234,
  549. /*
  550. cmdout:
  551.     INT int_err_unexpected_phase, WHEN NOT CMD
  552. at 0x00000091 : */ 0x9a030000,0x00000000,
  553. /*
  554. ENTRY cmdout_cmdout
  555. cmdout_cmdout:
  556.     MOVE FROM dsa_cmdout, WHEN CMD
  557. at 0x00000093 : */ 0x1a000000,0x00000048,
  558. /*
  559. ;
  560. ; data_transfer  
  561. ; other_out
  562. ; other_in
  563. ; other_transfer
  564. ;
  565. ; PURPOSE : handle the main data transfer for a SCSI command in 
  566. ; several parts.  In the first part, data_transfer, DATA_IN
  567. ; and DATA_OUT phases are allowed, with the user provided
  568. ; code (usually dynamically generated based on the scatter/gather
  569. ; list associated with a SCSI command) called to handle these 
  570. ; phases.
  571. ;
  572. ; After control has passed to one of the user provided 
  573. ; DATA_IN or DATA_OUT routines, back calls are made to 
  574. ; other_transfer_in or other_transfer_out to handle non-DATA IN
  575. ; and DATA OUT phases respectively, with the state of the active
  576. ; data pointer being preserved in TEMP.
  577. ;
  578. ; On completion, the user code passes control to other_transfer
  579. ; which causes DATA_IN and DATA_OUT to result in unexpected_phase
  580. ; interrupts so that data overruns may be trapped.
  581. ;
  582. ; INPUTS : DSA - SCSI command
  583. ;
  584. ; CALLS : OK in data_transfer_start, not ok in other_out and other_in, ok in
  585. ; other_transfer
  586. ;
  587. ; MODIFIES : SCRATCH
  588. ;
  589. ; EXITS : if STATUS IN is detected, signifying command completion,
  590. ; the NCR jumps to command_complete.  If MSG IN occurs, a 
  591. ; CALL is made to msg_in.  Otherwise, other_transfer runs in 
  592. ; an infinite loop.
  593. ;
  594. ENTRY data_transfer
  595. data_transfer:
  596.     JUMP cmdout_cmdout, WHEN CMD
  597. at 0x00000095 : */ 0x820b0000,0x0000024c,
  598. /*
  599.     CALL msg_in, WHEN MSG_IN
  600. at 0x00000097 : */ 0x8f0b0000,0x00000404,
  601. /*
  602.     INT int_err_unexpected_phase, WHEN MSG_OUT
  603. at 0x00000099 : */ 0x9e0b0000,0x00000000,
  604. /*
  605.     JUMP do_dataout, WHEN DATA_OUT
  606. at 0x0000009b : */ 0x800b0000,0x0000028c,
  607. /*
  608.     JUMP do_datain, WHEN DATA_IN
  609. at 0x0000009d : */ 0x810b0000,0x000002e4,
  610. /*
  611.     JUMP command_complete, WHEN STATUS
  612. at 0x0000009f : */ 0x830b0000,0x0000060c,
  613. /*
  614.     JUMP data_transfer
  615. at 0x000000a1 : */ 0x80080000,0x00000254,
  616. /*
  617. ENTRY end_data_transfer
  618. end_data_transfer:
  619. ;
  620. ; FIXME: On NCR53c700 and NCR53c700-66 chips, do_dataout/do_datain 
  621. ; should be fixed up whenever the nexus changes so it can point to the 
  622. ; correct routine for that command.
  623. ;
  624. ; Nasty jump to dsa->dataout
  625. do_dataout:
  626.     CALL dsa_to_scratch
  627. at 0x000000a3 : */ 0x88080000,0x00000938,
  628. /*
  629.     MOVE SCRATCH0 + dsa_dataout TO SCRATCH0
  630. at 0x000000a5 : */ 0x7e345000,0x00000000,
  631. /*
  632.     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY 
  633. at 0x000000a7 : */ 0x7f350000,0x00000000,
  634. /*
  635.     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY 
  636. at 0x000000a9 : */ 0x7f360000,0x00000000,
  637. /*
  638.     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY 
  639. at 0x000000ab : */ 0x7f370000,0x00000000,
  640. /*
  641.     MOVE dmode_ncr_to_memory TO DMODE
  642. at 0x000000ad : */ 0x78380000,0x00000000,
  643. /*
  644.     MOVE MEMORY 4, addr_scratch, dataout_to_jump + 4
  645. at 0x000000af : */ 0xc0000004,0x00000000,0x000002d4,
  646. /*
  647.     MOVE dmode_memory_to_memory TO DMODE
  648. at 0x000000b2 : */ 0x78380000,0x00000000,
  649. /*
  650. dataout_to_jump:
  651.     MOVE MEMORY 4, 0, dataout_jump + 4 
  652. at 0x000000b4 : */ 0xc0000004,0x00000000,0x000002e0,
  653. /*
  654. dataout_jump:
  655.     JUMP 0
  656. at 0x000000b7 : */ 0x80080000,0x00000000,
  657. /*
  658. ; Nasty jump to dsa->dsain
  659. do_datain:
  660.     CALL dsa_to_scratch
  661. at 0x000000b9 : */ 0x88080000,0x00000938,
  662. /*
  663.     MOVE SCRATCH0 + dsa_datain TO SCRATCH0
  664. at 0x000000bb : */ 0x7e345400,0x00000000,
  665. /*
  666.     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY 
  667. at 0x000000bd : */ 0x7f350000,0x00000000,
  668. /*
  669.     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY 
  670. at 0x000000bf : */ 0x7f360000,0x00000000,
  671. /*
  672.     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY 
  673. at 0x000000c1 : */ 0x7f370000,0x00000000,
  674. /*
  675.     MOVE dmode_ncr_to_memory TO DMODE
  676. at 0x000000c3 : */ 0x78380000,0x00000000,
  677. /*
  678.     MOVE MEMORY 4, addr_scratch, datain_to_jump + 4
  679. at 0x000000c5 : */ 0xc0000004,0x00000000,0x0000032c,
  680. /*
  681.     MOVE dmode_memory_to_memory TO DMODE
  682. at 0x000000c8 : */ 0x78380000,0x00000000,
  683. /*
  684. ENTRY datain_to_jump
  685. datain_to_jump:
  686.     MOVE MEMORY 4, 0, datain_jump + 4
  687. at 0x000000ca : */ 0xc0000004,0x00000000,0x00000338,
  688. /*
  689. datain_jump:
  690.     JUMP 0
  691. at 0x000000cd : */ 0x80080000,0x00000000,
  692. /*
  693. ; Note that other_out and other_in loop until a non-data phase
  694. ; is discovered, so we only execute return statements when we
  695. ; can go on to the next data phase block move statement.
  696. ENTRY other_out
  697. other_out:
  698.     INT int_err_unexpected_phase, WHEN CMD
  699. at 0x000000cf : */ 0x9a0b0000,0x00000000,
  700. /*
  701.     JUMP msg_in_restart, WHEN MSG_IN 
  702. at 0x000000d1 : */ 0x870b0000,0x000003e4,
  703. /*
  704.     INT int_err_unexpected_phase, WHEN MSG_OUT
  705. at 0x000000d3 : */ 0x9e0b0000,0x00000000,
  706. /*
  707.     INT int_err_unexpected_phase, WHEN DATA_IN
  708. at 0x000000d5 : */ 0x990b0000,0x00000000,
  709. /*
  710.     JUMP command_complete, WHEN STATUS
  711. at 0x000000d7 : */ 0x830b0000,0x0000060c,
  712. /*
  713.     JUMP other_out, WHEN NOT DATA_OUT
  714. at 0x000000d9 : */ 0x80030000,0x0000033c,
  715. /*
  716.     RETURN
  717. at 0x000000db : */ 0x90080000,0x00000000,
  718. /*
  719. ENTRY other_in
  720. other_in:
  721.     INT int_err_unexpected_phase, WHEN CMD
  722. at 0x000000dd : */ 0x9a0b0000,0x00000000,
  723. /*
  724.     JUMP msg_in_restart, WHEN MSG_IN 
  725. at 0x000000df : */ 0x870b0000,0x000003e4,
  726. /*
  727.     INT int_err_unexpected_phase, WHEN MSG_OUT
  728. at 0x000000e1 : */ 0x9e0b0000,0x00000000,
  729. /*
  730.     INT int_err_unexpected_phase, WHEN DATA_OUT
  731. at 0x000000e3 : */ 0x980b0000,0x00000000,
  732. /*
  733.     JUMP command_complete, WHEN STATUS
  734. at 0x000000e5 : */ 0x830b0000,0x0000060c,
  735. /*
  736.     JUMP other_in, WHEN NOT DATA_IN
  737. at 0x000000e7 : */ 0x81030000,0x00000374,
  738. /*
  739.     RETURN
  740. at 0x000000e9 : */ 0x90080000,0x00000000,
  741. /*
  742. ENTRY other_transfer
  743. other_transfer:
  744.     INT int_err_unexpected_phase, WHEN CMD
  745. at 0x000000eb : */ 0x9a0b0000,0x00000000,
  746. /*
  747.     CALL msg_in, WHEN MSG_IN
  748. at 0x000000ed : */ 0x8f0b0000,0x00000404,
  749. /*
  750.     INT int_err_unexpected_phase, WHEN MSG_OUT
  751. at 0x000000ef : */ 0x9e0b0000,0x00000000,
  752. /*
  753.     INT int_err_unexpected_phase, WHEN DATA_OUT
  754. at 0x000000f1 : */ 0x980b0000,0x00000000,
  755. /*
  756.     INT int_err_unexpected_phase, WHEN DATA_IN
  757. at 0x000000f3 : */ 0x990b0000,0x00000000,
  758. /*
  759.     JUMP command_complete, WHEN STATUS
  760. at 0x000000f5 : */ 0x830b0000,0x0000060c,
  761. /*
  762.     JUMP other_transfer
  763. at 0x000000f7 : */ 0x80080000,0x000003ac,
  764. /*
  765. ;
  766. ; msg_in_restart
  767. ; msg_in
  768. ; munge_msg
  769. ;
  770. ; PURPOSE : process messages from a target.  msg_in is called when the 
  771. ; caller hasn't read the first byte of the message.  munge_message
  772. ; is called when the caller has read the first byte of the message,
  773. ; and left it in SFBR.  msg_in_restart is called when the caller 
  774. ; hasn't read the first byte of the message, and wishes RETURN
  775. ; to transfer control back to the address of the conditional
  776. ; CALL instruction rather than to the instruction after it.
  777. ;
  778. ; Various int_* interrupts are generated when the host system
  779. ; needs to intervene, as is the case with SDTR, WDTR, and
  780. ; INITIATE RECOVERY messages.
  781. ;
  782. ; When the host system handles one of these interrupts,
  783. ; it can respond by reentering at reject_message, 
  784. ; which rejects the message and returns control to
  785. ; the caller of msg_in or munge_msg, accept_message
  786. ; which clears ACK and returns control, or reply_message
  787. ; which sends the message pointed to by the DSA 
  788. ; msgout_other table indirect field.
  789. ;
  790. ; DISCONNECT messages are handled by moving the command
  791. ; to the reconnect_dsa_queue.
  792. ;
  793. ; INPUTS : DSA - SCSI COMMAND, SFBR - first byte of message (munge_msg
  794. ; only)
  795. ;
  796. ; CALLS : NO.  The TEMP register isn't backed up to allow nested calls.
  797. ;
  798. ; MODIFIES : SCRATCH, DSA on DISCONNECT
  799. ;
  800. ; EXITS : On receipt of SAVE DATA POINTER, RESTORE POINTERS,
  801. ; and normal return from message handlers running under
  802. ; Linux, control is returned to the caller.  Receipt
  803. ; of DISCONNECT messages pass control to dsa_schedule.
  804. ;
  805. ENTRY msg_in_restart
  806. msg_in_restart:
  807. ; XXX - hackish
  808. ;
  809. ; Since it's easier to debug changes to the statically 
  810. ; compiled code, rather than the dynamically generated 
  811. ; stuff, such as
  812. ;
  813. ;  MOVE x, y, WHEN data_phase
  814. ;  CALL other_z, WHEN NOT data_phase
  815. ;  MOVE x, y, WHEN data_phase
  816. ;
  817. ; I'd like to have certain routines (notably the message handler)
  818. ; restart on the conditional call rather than the next instruction.
  819. ;
  820. ; So, subtract 8 from the return address
  821.     MOVE TEMP0 + 0xf8 TO TEMP0
  822. at 0x000000f9 : */ 0x7e1cf800,0x00000000,
  823. /*
  824.     MOVE TEMP1 + 0xff TO TEMP1 WITH CARRY
  825. at 0x000000fb : */ 0x7f1dff00,0x00000000,
  826. /*
  827.     MOVE TEMP2 + 0xff TO TEMP2 WITH CARRY
  828. at 0x000000fd : */ 0x7f1eff00,0x00000000,
  829. /*
  830.     MOVE TEMP3 + 0xff TO TEMP3 WITH CARRY
  831. at 0x000000ff : */ 0x7f1fff00,0x00000000,
  832. /*
  833. ENTRY msg_in
  834. msg_in:
  835.     MOVE 1, msg_buf, WHEN MSG_IN
  836. at 0x00000101 : */ 0x0f000001,0x00000000,
  837. /*
  838. munge_msg:
  839.     JUMP munge_extended, IF 0x01 ; EXTENDED MESSAGE
  840. at 0x00000103 : */ 0x800c0001,0x00000524,
  841. /*
  842.     JUMP munge_2, IF 0x20, AND MASK 0xdf ; two byte message
  843. at 0x00000105 : */ 0x800cdf20,0x0000044c,
  844. /*
  845. ;
  846. ; XXX - I've seen a handful of broken SCSI devices which fail to issue
  847. ;  a SAVE POINTERS message before disconnecting in the middle of 
  848. ;  a transfer, assuming that the DATA POINTER will be implicitly 
  849. ;  restored.  
  850. ;
  851. ; Historically, I've often done an implicit save when the DISCONNECT
  852. ; message is processed.  We may want to consider having the option of 
  853. ; doing that here. 
  854. ;
  855.     JUMP munge_save_data_pointer, IF 0x02 ; SAVE DATA POINTER
  856. at 0x00000107 : */ 0x800c0002,0x00000454,
  857. /*
  858.     JUMP munge_restore_pointers, IF 0x03 ; RESTORE POINTERS 
  859. at 0x00000109 : */ 0x800c0003,0x000004b8,
  860. /*
  861.     JUMP munge_disconnect, IF 0x04 ; DISCONNECT
  862. at 0x0000010b : */ 0x800c0004,0x0000051c,
  863. /*
  864.     INT int_msg_1, IF 0x07 ; MESSAGE REJECT
  865. at 0x0000010d : */ 0x980c0007,0x01020000,
  866. /*
  867.     INT int_msg_1, IF 0x0f ; INITIATE RECOVERY
  868. at 0x0000010f : */ 0x980c000f,0x01020000,
  869. /*
  870.     JUMP reject_message
  871. at 0x00000111 : */ 0x80080000,0x000005b4,
  872. /*
  873. munge_2:
  874.     JUMP reject_message
  875. at 0x00000113 : */ 0x80080000,0x000005b4,
  876. /*
  877. ;
  878. ; The SCSI standard allows targets to recover from transient 
  879. ; error conditions by backing up the data pointer with a 
  880. ; RESTORE POINTERS message.  
  881. ;
  882. ; So, we must save and restore the _residual_ code as well as 
  883. ; the current instruction pointer.  Because of this messiness,
  884. ; it is simpler to put dynamic code in the dsa for this and to
  885. ; just do a simple jump down there. 
  886. ;
  887. munge_save_data_pointer:
  888.     MOVE DSA0 + dsa_save_data_pointer TO SFBR
  889. at 0x00000115 : */ 0x76100000,0x00000000,
  890. /*
  891.     MOVE SFBR TO SCRATCH0
  892. at 0x00000117 : */ 0x6a340000,0x00000000,
  893. /*
  894.     MOVE DSA1 + 0xff TO SFBR WITH CARRY
  895. at 0x00000119 : */ 0x7711ff00,0x00000000,
  896. /*
  897.     MOVE SFBR TO SCRATCH1
  898. at 0x0000011b : */ 0x6a350000,0x00000000,
  899. /*
  900.     MOVE DSA2 + 0xff TO SFBR WITH CARRY 
  901. at 0x0000011d : */ 0x7712ff00,0x00000000,
  902. /*
  903.     MOVE SFBR TO SCRATCH2
  904. at 0x0000011f : */ 0x6a360000,0x00000000,
  905. /*
  906.     MOVE DSA3 + 0xff TO SFBR WITH CARRY
  907. at 0x00000121 : */ 0x7713ff00,0x00000000,
  908. /*
  909.     MOVE SFBR TO SCRATCH3
  910. at 0x00000123 : */ 0x6a370000,0x00000000,
  911. /*
  912.     MOVE dmode_ncr_to_memory TO DMODE
  913. at 0x00000125 : */ 0x78380000,0x00000000,
  914. /*
  915.     MOVE MEMORY 4, addr_scratch, jump_dsa_save + 4
  916. at 0x00000127 : */ 0xc0000004,0x00000000,0x000004b4,
  917. /*
  918.     MOVE dmode_memory_to_memory TO DMODE
  919. at 0x0000012a : */ 0x78380000,0x00000000,
  920. /*
  921. jump_dsa_save:
  922.     JUMP 0
  923. at 0x0000012c : */ 0x80080000,0x00000000,
  924. /*
  925. munge_restore_pointers:
  926.     MOVE DSA0 + dsa_restore_pointers TO SFBR
  927. at 0x0000012e : */ 0x76100000,0x00000000,
  928. /*
  929.     MOVE SFBR TO SCRATCH0
  930. at 0x00000130 : */ 0x6a340000,0x00000000,
  931. /*
  932.     MOVE DSA1 + 0xff TO SFBR WITH CARRY
  933. at 0x00000132 : */ 0x7711ff00,0x00000000,
  934. /*
  935.     MOVE SFBR TO SCRATCH1
  936. at 0x00000134 : */ 0x6a350000,0x00000000,
  937. /*
  938.     MOVE DSA2 + 0xff TO SFBR WITH CARRY
  939. at 0x00000136 : */ 0x7712ff00,0x00000000,
  940. /*
  941.     MOVE SFBR TO SCRATCH2
  942. at 0x00000138 : */ 0x6a360000,0x00000000,
  943. /*
  944.     MOVE DSA3 + 0xff TO SFBR WITH CARRY
  945. at 0x0000013a : */ 0x7713ff00,0x00000000,
  946. /*
  947.     MOVE SFBR TO SCRATCH3
  948. at 0x0000013c : */ 0x6a370000,0x00000000,
  949. /*
  950.     MOVE dmode_ncr_to_memory TO DMODE
  951. at 0x0000013e : */ 0x78380000,0x00000000,
  952. /*
  953.     MOVE MEMORY 4, addr_scratch, jump_dsa_restore + 4
  954. at 0x00000140 : */ 0xc0000004,0x00000000,0x00000518,
  955. /*
  956.     MOVE dmode_memory_to_memory TO DMODE
  957. at 0x00000143 : */ 0x78380000,0x00000000,
  958. /*
  959. jump_dsa_restore:
  960.     JUMP 0
  961. at 0x00000145 : */ 0x80080000,0x00000000,
  962. /*
  963. munge_disconnect:
  964.  
  965.     JUMP dsa_schedule
  966. at 0x00000147 : */ 0x80080000,0x00000168,
  967. /*
  968. munge_extended:
  969.     CLEAR ACK
  970. at 0x00000149 : */ 0x60000040,0x00000000,
  971. /*
  972.     INT int_err_unexpected_phase, WHEN NOT MSG_IN
  973. at 0x0000014b : */ 0x9f030000,0x00000000,
  974. /*
  975.     MOVE 1, msg_buf + 1, WHEN MSG_IN
  976. at 0x0000014d : */ 0x0f000001,0x00000001,
  977. /*
  978.     JUMP munge_extended_2, IF 0x02
  979. at 0x0000014f : */ 0x800c0002,0x00000554,
  980. /*
  981.     JUMP munge_extended_3, IF 0x03 
  982. at 0x00000151 : */ 0x800c0003,0x00000584,
  983. /*
  984.     JUMP reject_message
  985. at 0x00000153 : */ 0x80080000,0x000005b4,
  986. /*
  987. munge_extended_2:
  988.     CLEAR ACK
  989. at 0x00000155 : */ 0x60000040,0x00000000,
  990. /*
  991.     MOVE 1, msg_buf + 2, WHEN MSG_IN
  992. at 0x00000157 : */ 0x0f000001,0x00000002,
  993. /*
  994.     JUMP reject_message, IF NOT 0x02 ; Must be WDTR
  995. at 0x00000159 : */ 0x80040002,0x000005b4,
  996. /*
  997.     CLEAR ACK
  998. at 0x0000015b : */ 0x60000040,0x00000000,
  999. /*
  1000.     MOVE 1, msg_buf + 3, WHEN MSG_IN
  1001. at 0x0000015d : */ 0x0f000001,0x00000003,
  1002. /*
  1003.     INT int_msg_wdtr
  1004. at 0x0000015f : */ 0x98080000,0x01000000,
  1005. /*
  1006. munge_extended_3:
  1007.     CLEAR ACK
  1008. at 0x00000161 : */ 0x60000040,0x00000000,
  1009. /*
  1010.     MOVE 1, msg_buf + 2, WHEN MSG_IN
  1011. at 0x00000163 : */ 0x0f000001,0x00000002,
  1012. /*
  1013.     JUMP reject_message, IF NOT 0x01 ; Must be SDTR
  1014. at 0x00000165 : */ 0x80040001,0x000005b4,
  1015. /*
  1016.     CLEAR ACK
  1017. at 0x00000167 : */ 0x60000040,0x00000000,
  1018. /*
  1019.     MOVE 2, msg_buf + 3, WHEN MSG_IN
  1020. at 0x00000169 : */ 0x0f000002,0x00000003,
  1021. /*
  1022.     INT int_msg_sdtr
  1023. at 0x0000016b : */ 0x98080000,0x01010000,
  1024. /*
  1025. ENTRY reject_message
  1026. reject_message:
  1027.     SET ATN
  1028. at 0x0000016d : */ 0x58000008,0x00000000,
  1029. /*
  1030.     CLEAR ACK
  1031. at 0x0000016f : */ 0x60000040,0x00000000,
  1032. /*
  1033.     MOVE 1, NCR53c7xx_msg_reject, WHEN MSG_OUT
  1034. at 0x00000171 : */ 0x0e000001,0x00000000,
  1035. /*
  1036.     RETURN
  1037. at 0x00000173 : */ 0x90080000,0x00000000,
  1038. /*
  1039. ENTRY accept_message
  1040. accept_message:
  1041.     CLEAR ATN
  1042. at 0x00000175 : */ 0x60000008,0x00000000,
  1043. /*
  1044.     CLEAR ACK
  1045. at 0x00000177 : */ 0x60000040,0x00000000,
  1046. /*
  1047.     RETURN
  1048. at 0x00000179 : */ 0x90080000,0x00000000,
  1049. /*
  1050. ENTRY respond_message
  1051. respond_message:
  1052.     SET ATN
  1053. at 0x0000017b : */ 0x58000008,0x00000000,
  1054. /*
  1055.     CLEAR ACK
  1056. at 0x0000017d : */ 0x60000040,0x00000000,
  1057. /*
  1058.     MOVE FROM dsa_msgout_other, WHEN MSG_OUT
  1059. at 0x0000017f : */ 0x1e000000,0x00000068,
  1060. /*
  1061.     RETURN
  1062. at 0x00000181 : */ 0x90080000,0x00000000,
  1063. /*
  1064. ;
  1065. ; command_complete
  1066. ;
  1067. ; PURPOSE : handle command termination when STATUS IN is detected by reading
  1068. ; a status byte followed by a command termination message. 
  1069. ;
  1070. ; Normal termination results in an INTFLY instruction, and 
  1071. ; the host system can pick out which command terminated by 
  1072. ; examining the MESSAGE and STATUS buffers of all currently 
  1073. ; executing commands;
  1074. ;
  1075. ; Abnormal (CHECK_CONDITION) termination results in an
  1076. ; int_err_check_condition interrupt so that a REQUEST SENSE
  1077. ; command can be issued out-of-order so that no other command
  1078. ; clears the contingent allegiance condition.
  1079. ;
  1080. ;
  1081. ; INPUTS : DSA - command
  1082. ;
  1083. ; CALLS : OK
  1084. ;
  1085. ; EXITS : On successful termination, control is passed to schedule.
  1086. ; On abnormal termination, the user will usually modify the 
  1087. ; DSA fields and corresponding buffers and return control
  1088. ; to select.
  1089. ;
  1090. ENTRY command_complete
  1091. command_complete:
  1092.     MOVE FROM dsa_status, WHEN STATUS
  1093. at 0x00000183 : */ 0x1b000000,0x00000060,
  1094. /*
  1095.     MOVE SFBR TO SCRATCH0 ; Save status
  1096. at 0x00000185 : */ 0x6a340000,0x00000000,
  1097. /*
  1098. ENTRY command_complete_msgin
  1099. command_complete_msgin:
  1100.     MOVE FROM dsa_msgin, WHEN MSG_IN
  1101. at 0x00000187 : */ 0x1f000000,0x00000058,
  1102. /*
  1103. ; Indicate that we should be expecting a disconnect
  1104.     MOVE SCNTL2 & 0x7f TO SCNTL2
  1105. at 0x00000189 : */ 0x7c027f00,0x00000000,
  1106. /*
  1107.     CLEAR ACK
  1108. at 0x0000018b : */ 0x60000040,0x00000000,
  1109. /*
  1110.     WAIT DISCONNECT
  1111. at 0x0000018d : */ 0x48000000,0x00000000,
  1112. /*
  1113. ;
  1114. ; The SCSI specification states that when a UNIT ATTENTION condition
  1115. ; is pending, as indicated by a CHECK CONDITION status message,
  1116. ; the target shall revert to asynchronous transfers.  Since
  1117. ; synchronous transfers parameters are maintained on a per INITIATOR/TARGET 
  1118. ; basis, and returning control to our scheduler could work on a command
  1119. ; running on another lun on that target using the old parameters, we must
  1120. ; interrupt the host processor to get them changed, or change them ourselves.
  1121. ;
  1122. ; Once SCSI-II tagged queueing is implemented, things will be even more
  1123. ; hairy, since contingent allegiance conditions exist on a per-target/lun
  1124. ; basis, and issuing a new command with a different tag would clear it.
  1125. ; In these cases, we must interrupt the host processor to get a request 
  1126. ; added to the HEAD of the queue with the request sense command, or we
  1127. ; must automatically issue the request sense command.
  1128.     INTFLY
  1129. at 0x0000018f : */ 0x98180000,0x00000000,
  1130. /*
  1131.     JUMP schedule
  1132. at 0x00000191 : */ 0x80080000,0x00000000,
  1133. /*
  1134. command_failed:
  1135.     INT int_err_check_condition
  1136. at 0x00000193 : */ 0x98080000,0x00030000,
  1137. /*
  1138. ;
  1139. ; wait_reselect
  1140. ;
  1141. ; PURPOSE : This is essentially the idle routine, where control lands
  1142. ; when there are no new processes to schedule.  wait_reselect
  1143. ; waits for reselection, selection, and new commands.
  1144. ;
  1145. ; When a successful reselection occurs, with the aid 
  1146. ; of fixed up code in each DSA, wait_reselect walks the 
  1147. ; reconnect_dsa_queue, asking each dsa if the target ID
  1148. ; and LUN match its.
  1149. ;
  1150. ; If a match is found, a call is made back to reselected_ok,
  1151. ; which through the miracles of self modifying code, extracts
  1152. ; the found DSA from the reconnect_dsa_queue and then 
  1153. ; returns control to the DSAs thread of execution.
  1154. ;
  1155. ; INPUTS : NONE
  1156. ;
  1157. ; CALLS : OK
  1158. ;
  1159. ; MODIFIES : DSA,
  1160. ;
  1161. ; EXITS : On successful reselection, control is returned to the 
  1162. ; DSA which called reselected_ok.  If the WAIT RESELECT
  1163. ; was interrupted by a new commands arrival signaled by 
  1164. ; SIG_P, control is passed to schedule.  If the NCR is 
  1165. ; selected, the host system is interrupted with an 
  1166. ; int_err_selected which is usually responded to by
  1167. ; setting DSP to the target_abort address.
  1168. ENTRY wait_reselect
  1169. wait_reselect:
  1170.     WAIT RESELECT wait_reselect_failed
  1171. at 0x00000195 : */ 0x50000000,0x0000076c,
  1172. /*
  1173. reselected:
  1174.     CLEAR TARGET
  1175. at 0x00000197 : */ 0x60000200,0x00000000,
  1176. /*
  1177.     MOVE dmode_memory_to_memory TO DMODE
  1178. at 0x00000199 : */ 0x78380000,0x00000000,
  1179. /*
  1180.     ; Read all data needed to reestablish the nexus - 
  1181.     MOVE 1, reselected_identify, WHEN MSG_IN
  1182. at 0x0000019b : */ 0x0f000001,0x00000000,
  1183. /*
  1184.     ; We used to CLEAR ACK here.
  1185.     ; Point DSA at the current head of the disconnected queue.
  1186.     MOVE dmode_memory_to_ncr  TO DMODE
  1187. at 0x0000019d : */ 0x78380000,0x00000000,
  1188. /*
  1189.     MOVE MEMORY 4, reconnect_dsa_head, addr_scratch
  1190. at 0x0000019f : */ 0xc0000004,0x00000000,0x00000000,
  1191. /*
  1192.     MOVE dmode_memory_to_memory TO DMODE
  1193. at 0x000001a2 : */ 0x78380000,0x00000000,
  1194. /*
  1195.     CALL scratch_to_dsa
  1196. at 0x000001a4 : */ 0x88080000,0x00000980,
  1197. /*
  1198.     ; Fix the update-next pointer so that the reconnect_dsa_head
  1199.     ; pointer is the one that will be updated if this DSA is a hit 
  1200.     ; and we remove it from the queue.
  1201.     MOVE MEMORY 4, addr_reconnect_dsa_head, reselected_ok + 8
  1202. at 0x000001a6 : */ 0xc0000004,0x00000000,0x00000758,
  1203. /*
  1204. ENTRY reselected_check_next
  1205. reselected_check_next:
  1206.     ; Check for a NULL pointer.
  1207.     MOVE DSA0 TO SFBR
  1208. at 0x000001a9 : */ 0x72100000,0x00000000,
  1209. /*
  1210.     JUMP reselected_not_end, IF NOT 0
  1211. at 0x000001ab : */ 0x80040000,0x000006ec,
  1212. /*
  1213.     MOVE DSA1 TO SFBR
  1214. at 0x000001ad : */ 0x72110000,0x00000000,
  1215. /*
  1216.     JUMP reselected_not_end, IF NOT 0
  1217. at 0x000001af : */ 0x80040000,0x000006ec,
  1218. /*
  1219.     MOVE DSA2 TO SFBR
  1220. at 0x000001b1 : */ 0x72120000,0x00000000,
  1221. /*
  1222.     JUMP reselected_not_end, IF NOT 0
  1223. at 0x000001b3 : */ 0x80040000,0x000006ec,
  1224. /*
  1225.     MOVE DSA3 TO SFBR
  1226. at 0x000001b5 : */ 0x72130000,0x00000000,
  1227. /*
  1228.     JUMP reselected_not_end, IF NOT 0
  1229. at 0x000001b7 : */ 0x80040000,0x000006ec,
  1230. /*
  1231.     INT int_err_unexpected_reselect
  1232. at 0x000001b9 : */ 0x98080000,0x00020000,
  1233. /*
  1234. reselected_not_end:
  1235.     ;
  1236.     ; XXX the ALU is only eight bits wide, and the assembler
  1237.     ; wont do the dirt work for us.  As long as dsa_check_reselect
  1238.     ; is negative, we need to sign extend with 1 bits to the full
  1239.     ; 32 bit width of the address.
  1240.     ;
  1241.     ; A potential work around would be to have a known alignment 
  1242.     ; of the DSA structure such that the base address plus 
  1243.     ; dsa_check_reselect doesn't require carrying from bytes 
  1244.     ; higher than the LSB.
  1245.     ;
  1246.     MOVE DSA0 TO SFBR
  1247. at 0x000001bb : */ 0x72100000,0x00000000,
  1248. /*
  1249.     MOVE SFBR + dsa_check_reselect TO SCRATCH0
  1250. at 0x000001bd : */ 0x6e340000,0x00000000,
  1251. /*
  1252.     MOVE DSA1 TO SFBR
  1253. at 0x000001bf : */ 0x72110000,0x00000000,
  1254. /*
  1255.     MOVE SFBR + 0xff TO SCRATCH1 WITH CARRY
  1256. at 0x000001c1 : */ 0x6f35ff00,0x00000000,
  1257. /*
  1258.     MOVE DSA2 TO SFBR
  1259. at 0x000001c3 : */ 0x72120000,0x00000000,
  1260. /*
  1261.     MOVE SFBR + 0xff TO SCRATCH2 WITH CARRY
  1262. at 0x000001c5 : */ 0x6f36ff00,0x00000000,
  1263. /*
  1264.     MOVE DSA3 TO SFBR
  1265. at 0x000001c7 : */ 0x72130000,0x00000000,
  1266. /*
  1267.     MOVE SFBR + 0xff TO SCRATCH3 WITH CARRY
  1268. at 0x000001c9 : */ 0x6f37ff00,0x00000000,
  1269. /*
  1270.     MOVE dmode_ncr_to_memory TO DMODE
  1271. at 0x000001cb : */ 0x78380000,0x00000000,
  1272. /*
  1273.     MOVE MEMORY 4, addr_scratch, reselected_check + 4
  1274. at 0x000001cd : */ 0xc0000004,0x00000000,0x0000074c,
  1275. /*
  1276.     MOVE dmode_memory_to_memory TO DMODE
  1277. at 0x000001d0 : */ 0x78380000,0x00000000,
  1278. /*
  1279. reselected_check:
  1280.     JUMP 0
  1281. at 0x000001d2 : */ 0x80080000,0x00000000,
  1282. /*
  1283. ;
  1284. ;
  1285. ENTRY reselected_ok
  1286. reselected_ok:
  1287.     MOVE MEMORY 4, 0, 0 ; Patched : first word
  1288. at 0x000001d4 : */ 0xc0000004,0x00000000,0x00000000,
  1289. /*
  1290. ;  is address of 
  1291. ;       successful dsa_next
  1292. ; Second word is last 
  1293. ; unsuccessful dsa_next,
  1294. ; starting with 
  1295. ;       dsa_reconnect_head
  1296.     ; We used to CLEAR ACK here.
  1297.     RETURN ; Return control to where
  1298. at 0x000001d7 : */ 0x90080000,0x00000000,
  1299. /*
  1300. selected:
  1301.     INT int_err_selected;
  1302. at 0x000001d9 : */ 0x98080000,0x00010000,
  1303. /*
  1304. ;
  1305. ; A select or reselect failure can be caused by one of two conditions : 
  1306. ; 1.  SIG_P was set.  This will be the case if the user has written
  1307. ; a new value to a previously NULL head of the issue queue.
  1308. ;
  1309. ; 2.  The NCR53c810 was selected or reselected by another device.
  1310. ;
  1311. ; 3.  The bus was already busy since we were selected or reselected
  1312. ; before starting the command.
  1313. wait_reselect_failed:
  1314. ; Check selected bit.  
  1315.     MOVE SIST0 & 0x20 TO SFBR
  1316. at 0x000001db : */ 0x74422000,0x00000000,
  1317. /*
  1318.     JUMP selected, IF 0x20
  1319. at 0x000001dd : */ 0x800c0020,0x00000764,
  1320. /*
  1321. ; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
  1322.     MOVE CTEST2 & 0x40 TO SFBR
  1323. at 0x000001df : */ 0x741a4000,0x00000000,
  1324. /*
  1325.     JUMP schedule, IF 0x40
  1326. at 0x000001e1 : */ 0x800c0040,0x00000000,
  1327. /*
  1328. ; Check connected bit.  
  1329. ; FIXME: this needs to change if we support target mode
  1330.     MOVE ISTAT & 0x08 TO SFBR
  1331. at 0x000001e3 : */ 0x74140800,0x00000000,
  1332. /*
  1333.     JUMP reselected, IF 0x08
  1334. at 0x000001e5 : */ 0x800c0008,0x0000065c,
  1335. /*
  1336. ; FIXME : Something bogus happened, and we shouldn't fail silently.
  1337.     INT int_debug_panic
  1338. at 0x000001e7 : */ 0x98080000,0x030b0000,
  1339. /*
  1340. select_failed:
  1341. ; Otherwise, mask the selected and reselected bits off SIST0
  1342.     MOVE SIST0 & 0x30 TO SFBR
  1343. at 0x000001e9 : */ 0x74423000,0x00000000,
  1344. /*
  1345.     JUMP selected, IF 0x20
  1346. at 0x000001eb : */ 0x800c0020,0x00000764,
  1347. /*
  1348.     JUMP reselected, IF 0x10 
  1349. at 0x000001ed : */ 0x800c0010,0x0000065c,
  1350. /*
  1351. ; If SIGP is set, the user just gave us another command, and
  1352. ; we should restart or return to the scheduler.
  1353. ; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
  1354.     MOVE CTEST2 & 0x40 TO SFBR
  1355. at 0x000001ef : */ 0x741a4000,0x00000000,
  1356. /*
  1357.     JUMP select, IF 0x40
  1358. at 0x000001f1 : */ 0x800c0040,0x000001fc,
  1359. /*
  1360. ; Check connected bit.  
  1361. ; FIXME: this needs to change if we support target mode
  1362. ; FIXME: is this really necessary? 
  1363.     MOVE ISTAT & 0x08 TO SFBR
  1364. at 0x000001f3 : */ 0x74140800,0x00000000,
  1365. /*
  1366.     JUMP reselected, IF 0x08
  1367. at 0x000001f5 : */ 0x800c0008,0x0000065c,
  1368. /*
  1369. ; FIXME : Something bogus happened, and we shouldn't fail silently.
  1370.     INT int_debug_panic
  1371. at 0x000001f7 : */ 0x98080000,0x030b0000,
  1372. /*
  1373. ;
  1374. ; test_1
  1375. ; test_2
  1376. ;
  1377. ; PURPOSE : run some verification tests on the NCR.  test_1
  1378. ; copies test_src to test_dest and interrupts the host
  1379. ; processor, testing for cache coherency and interrupt
  1380. ;  problems in the processes.
  1381. ;
  1382. ; test_2 runs a command with offsets relative to the 
  1383. ; DSA on entry, and is useful for miscellaneous experimentation.
  1384. ;
  1385. ; Verify that interrupts are working correctly and that we don't 
  1386. ; have a cache invalidation problem.
  1387. ABSOLUTE test_src = 0, test_dest = 0
  1388. ENTRY test_1
  1389. test_1:
  1390.     MOVE MEMORY 4, test_src, test_dest
  1391. at 0x000001f9 : */ 0xc0000004,0x00000000,0x00000000,
  1392. /*
  1393.     INT int_test_1
  1394. at 0x000001fc : */ 0x98080000,0x04000000,
  1395. /*
  1396. ;
  1397. ; Run arbitrary commands, with test code establishing a DSA
  1398. ;
  1399.  
  1400. ENTRY test_2
  1401. test_2:
  1402.     CLEAR TARGET
  1403. at 0x000001fe : */ 0x60000200,0x00000000,
  1404. /*
  1405.     SELECT ATN FROM 0, test_2_fail
  1406. at 0x00000200 : */ 0x43000000,0x00000850,
  1407. /*
  1408.     JUMP test_2_msgout, WHEN MSG_OUT
  1409. at 0x00000202 : */ 0x860b0000,0x00000810,
  1410. /*
  1411. ENTRY test_2_msgout
  1412. test_2_msgout:
  1413.     MOVE FROM 8, WHEN MSG_OUT
  1414. at 0x00000204 : */ 0x1e000000,0x00000008,
  1415. /*
  1416.     MOVE FROM 16, WHEN CMD 
  1417. at 0x00000206 : */ 0x1a000000,0x00000010,
  1418. /*
  1419.     MOVE FROM 24, WHEN DATA_IN
  1420. at 0x00000208 : */ 0x19000000,0x00000018,
  1421. /*
  1422.     MOVE FROM 32, WHEN STATUS
  1423. at 0x0000020a : */ 0x1b000000,0x00000020,
  1424. /*
  1425.     MOVE FROM 40, WHEN MSG_IN
  1426. at 0x0000020c : */ 0x1f000000,0x00000028,
  1427. /*
  1428.     MOVE SCNTL2 & 0x7f TO SCNTL2
  1429. at 0x0000020e : */ 0x7c027f00,0x00000000,
  1430. /*
  1431.     CLEAR ACK
  1432. at 0x00000210 : */ 0x60000040,0x00000000,
  1433. /*
  1434.     WAIT DISCONNECT
  1435. at 0x00000212 : */ 0x48000000,0x00000000,
  1436. /*
  1437. test_2_fail:
  1438.     INT int_test_2
  1439. at 0x00000214 : */ 0x98080000,0x04010000,
  1440. /*
  1441. ENTRY debug_break
  1442. debug_break:
  1443.     INT int_debug_break
  1444. at 0x00000216 : */ 0x98080000,0x03000000,
  1445. /*
  1446. ;
  1447. ; initiator_abort
  1448. ; target_abort
  1449. ;
  1450. ; PURPOSE : Abort the currently established nexus from with initiator
  1451. ; or target mode.
  1452. ;
  1453. ;  
  1454. ENTRY target_abort
  1455. target_abort:
  1456.     SET TARGET
  1457. at 0x00000218 : */ 0x58000200,0x00000000,
  1458. /*
  1459.     DISCONNECT
  1460. at 0x0000021a : */ 0x48000000,0x00000000,
  1461. /*
  1462.     CLEAR TARGET
  1463. at 0x0000021c : */ 0x60000200,0x00000000,
  1464. /*
  1465.     JUMP schedule
  1466. at 0x0000021e : */ 0x80080000,0x00000000,
  1467. /*
  1468.     
  1469. ENTRY initiator_abort
  1470. initiator_abort:
  1471.     SET ATN
  1472. at 0x00000220 : */ 0x58000008,0x00000000,
  1473. /*
  1474. ;
  1475. ; The SCSI-I specification says that targets may go into MSG out at 
  1476. ; their leisure upon receipt of the ATN single.  On all versions of the 
  1477. ; specification, we can't change phases until REQ transitions true->false, 
  1478. ; so we need to sink/source one byte of data to allow the transition.
  1479. ;
  1480. ; For the sake of safety, we'll only source one byte of data in all 
  1481. ; cases, but to accommodate the SCSI-I dain bramage, we'll sink an  
  1482. ; arbitrary number of bytes.
  1483.     JUMP spew_cmd, WHEN CMD
  1484. at 0x00000222 : */ 0x820b0000,0x000008b8,
  1485. /*
  1486.     JUMP eat_msgin, WHEN MSG_IN
  1487. at 0x00000224 : */ 0x870b0000,0x000008c8,
  1488. /*
  1489.     JUMP eat_datain, WHEN DATA_IN
  1490. at 0x00000226 : */ 0x810b0000,0x000008f8,
  1491. /*
  1492.     JUMP eat_status, WHEN STATUS
  1493. at 0x00000228 : */ 0x830b0000,0x000008e0,
  1494. /*
  1495.     JUMP spew_dataout, WHEN DATA_OUT
  1496. at 0x0000022a : */ 0x800b0000,0x00000910,
  1497. /*
  1498.     JUMP sated
  1499. at 0x0000022c : */ 0x80080000,0x00000918,
  1500. /*
  1501. spew_cmd:
  1502.     MOVE 1, NCR53c7xx_zero, WHEN CMD
  1503. at 0x0000022e : */ 0x0a000001,0x00000000,
  1504. /*
  1505.     JUMP sated
  1506. at 0x00000230 : */ 0x80080000,0x00000918,
  1507. /*
  1508. eat_msgin:
  1509.     MOVE 1, NCR53c7xx_sink, WHEN MSG_IN
  1510. at 0x00000232 : */ 0x0f000001,0x00000000,
  1511. /*
  1512.     JUMP eat_msgin, WHEN MSG_IN
  1513. at 0x00000234 : */ 0x870b0000,0x000008c8,
  1514. /*
  1515.     JUMP sated
  1516. at 0x00000236 : */ 0x80080000,0x00000918,
  1517. /*
  1518. eat_status:
  1519.     MOVE 1, NCR53c7xx_sink, WHEN STATUS
  1520. at 0x00000238 : */ 0x0b000001,0x00000000,
  1521. /*
  1522.     JUMP eat_status, WHEN STATUS
  1523. at 0x0000023a : */ 0x830b0000,0x000008e0,
  1524. /*
  1525.     JUMP sated
  1526. at 0x0000023c : */ 0x80080000,0x00000918,
  1527. /*
  1528. eat_datain:
  1529.     MOVE 1, NCR53c7xx_sink, WHEN DATA_IN
  1530. at 0x0000023e : */ 0x09000001,0x00000000,
  1531. /*
  1532.     JUMP eat_datain, WHEN DATA_IN
  1533. at 0x00000240 : */ 0x810b0000,0x000008f8,
  1534. /*
  1535.     JUMP sated
  1536. at 0x00000242 : */ 0x80080000,0x00000918,
  1537. /*
  1538. spew_dataout:
  1539.     MOVE 1, NCR53c7xx_zero, WHEN DATA_OUT
  1540. at 0x00000244 : */ 0x08000001,0x00000000,
  1541. /*
  1542. sated:
  1543.     MOVE SCNTL2 & 0x7f TO SCNTL2
  1544. at 0x00000246 : */ 0x7c027f00,0x00000000,
  1545. /*
  1546.     MOVE 1, NCR53c7xx_msg_abort, WHEN MSG_OUT
  1547. at 0x00000248 : */ 0x0e000001,0x00000000,
  1548. /*
  1549.     WAIT DISCONNECT
  1550. at 0x0000024a : */ 0x48000000,0x00000000,
  1551. /*
  1552.     INT int_norm_aborted
  1553. at 0x0000024c : */ 0x98080000,0x02040000,
  1554. /*
  1555. ;
  1556. ; dsa_to_scratch
  1557. ; scratch_to_dsa
  1558. ;
  1559. ; PURPOSE :
  1560. ;  The NCR chips cannot do a move memory instruction with the DSA register 
  1561. ;  as the source or destination.  So, we provide a couple of subroutines
  1562. ;  that let us switch between the DSA register and scratch register.
  1563. ;
  1564. ;  Memory moves to/from the DSPS  register also don't work, but we 
  1565. ;  don't use them.
  1566. ;
  1567. ;
  1568.  
  1569. dsa_to_scratch:
  1570.     MOVE DSA0 TO SFBR
  1571. at 0x0000024e : */ 0x72100000,0x00000000,
  1572. /*
  1573.     MOVE SFBR TO SCRATCH0
  1574. at 0x00000250 : */ 0x6a340000,0x00000000,
  1575. /*
  1576.     MOVE DSA1 TO SFBR
  1577. at 0x00000252 : */ 0x72110000,0x00000000,
  1578. /*
  1579.     MOVE SFBR TO SCRATCH1
  1580. at 0x00000254 : */ 0x6a350000,0x00000000,
  1581. /*
  1582.     MOVE DSA2 TO SFBR
  1583. at 0x00000256 : */ 0x72120000,0x00000000,
  1584. /*
  1585.     MOVE SFBR TO SCRATCH2
  1586. at 0x00000258 : */ 0x6a360000,0x00000000,
  1587. /*
  1588.     MOVE DSA3 TO SFBR
  1589. at 0x0000025a : */ 0x72130000,0x00000000,
  1590. /*
  1591.     MOVE SFBR TO SCRATCH3
  1592. at 0x0000025c : */ 0x6a370000,0x00000000,
  1593. /*
  1594.     RETURN
  1595. at 0x0000025e : */ 0x90080000,0x00000000,
  1596. /*
  1597. scratch_to_dsa:
  1598.     MOVE SCRATCH0 TO SFBR
  1599. at 0x00000260 : */ 0x72340000,0x00000000,
  1600. /*
  1601.     MOVE SFBR TO DSA0
  1602. at 0x00000262 : */ 0x6a100000,0x00000000,
  1603. /*
  1604.     MOVE SCRATCH1 TO SFBR
  1605. at 0x00000264 : */ 0x72350000,0x00000000,
  1606. /*
  1607.     MOVE SFBR TO DSA1
  1608. at 0x00000266 : */ 0x6a110000,0x00000000,
  1609. /*
  1610.     MOVE SCRATCH2 TO SFBR
  1611. at 0x00000268 : */ 0x72360000,0x00000000,
  1612. /*
  1613.     MOVE SFBR TO DSA2
  1614. at 0x0000026a : */ 0x6a120000,0x00000000,
  1615. /*
  1616.     MOVE SCRATCH3 TO SFBR
  1617. at 0x0000026c : */ 0x72370000,0x00000000,
  1618. /*
  1619.     MOVE SFBR TO DSA3
  1620. at 0x0000026e : */ 0x6a130000,0x00000000,
  1621. /*
  1622.     RETURN
  1623. at 0x00000270 : */ 0x90080000,0x00000000,
  1624. };
  1625. #define A_NCR53c7xx_msg_abort 0x00000000
  1626. static u32 A_NCR53c7xx_msg_abort_used[] __attribute((unused)) = {
  1627. 0x00000249,
  1628. };
  1629. #define A_NCR53c7xx_msg_reject 0x00000000
  1630. static u32 A_NCR53c7xx_msg_reject_used[] __attribute((unused)) = {
  1631. 0x00000172,
  1632. };
  1633. #define A_NCR53c7xx_sink 0x00000000
  1634. static u32 A_NCR53c7xx_sink_used[] __attribute((unused)) = {
  1635. 0x00000233,
  1636. 0x00000239,
  1637. 0x0000023f,
  1638. };
  1639. #define A_NCR53c7xx_zero 0x00000000
  1640. static u32 A_NCR53c7xx_zero_used[] __attribute((unused)) = {
  1641. 0x0000022f,
  1642. 0x00000245,
  1643. };
  1644. #define A_NOP_insn 0x00000000
  1645. static u32 A_NOP_insn_used[] __attribute((unused)) = {
  1646. 0x00000010,
  1647. };
  1648. #define A_addr_reconnect_dsa_head 0x00000000
  1649. static u32 A_addr_reconnect_dsa_head_used[] __attribute((unused)) = {
  1650. 0x000001a7,
  1651. };
  1652. #define A_addr_scratch 0x00000000
  1653. static u32 A_addr_scratch_used[] __attribute((unused)) = {
  1654. 0x00000004,
  1655. 0x0000001b,
  1656. 0x00000046,
  1657. 0x00000067,
  1658. 0x00000073,
  1659. 0x000000b0,
  1660. 0x000000c6,
  1661. 0x00000128,
  1662. 0x00000141,
  1663. 0x000001a1,
  1664. 0x000001ce,
  1665. };
  1666. #define A_addr_temp 0x00000000
  1667. static u32 A_addr_temp_used[] __attribute((unused)) = {
  1668. 0x00000025,
  1669. 0x00000034,
  1670. };
  1671. #define A_dmode_memory_to_memory 0x00000000
  1672. static u32 A_dmode_memory_to_memory_used[] __attribute((unused)) = {
  1673. 0x00000005,
  1674. 0x0000001c,
  1675. 0x00000027,
  1676. 0x00000035,
  1677. 0x00000047,
  1678. 0x00000069,
  1679. 0x00000075,
  1680. 0x000000b2,
  1681. 0x000000c8,
  1682. 0x0000012a,
  1683. 0x00000143,
  1684. 0x00000199,
  1685. 0x000001a2,
  1686. 0x000001d0,
  1687. };
  1688. #define A_dmode_memory_to_ncr 0x00000000
  1689. static u32 A_dmode_memory_to_ncr_used[] __attribute((unused)) = {
  1690. 0x00000000,
  1691. 0x00000017,
  1692. 0x00000030,
  1693. 0x00000042,
  1694. 0x0000019d,
  1695. };
  1696. #define A_dmode_ncr_to_memory 0x00000000
  1697. static u32 A_dmode_ncr_to_memory_used[] __attribute((unused)) = {
  1698. 0x00000022,
  1699. 0x00000064,
  1700. 0x00000070,
  1701. 0x000000ad,
  1702. 0x000000c3,
  1703. 0x00000125,
  1704. 0x0000013e,
  1705. 0x000001cb,
  1706. };
  1707. #define A_dsa_check_reselect 0x00000000
  1708. static u32 A_dsa_check_reselect_used[] __attribute((unused)) = {
  1709. 0x000001bd,
  1710. };
  1711. #define A_dsa_cmdout 0x00000048
  1712. static u32 A_dsa_cmdout_used[] __attribute((unused)) = {
  1713. 0x00000094,
  1714. };
  1715. #define A_dsa_cmnd 0x00000038
  1716. static u32 A_dsa_cmnd_used[] __attribute((unused)) = {
  1717. };
  1718. #define A_dsa_datain 0x00000054
  1719. static u32 A_dsa_datain_used[] __attribute((unused)) = {
  1720. 0x000000bb,
  1721. };
  1722. #define A_dsa_dataout 0x00000050
  1723. static u32 A_dsa_dataout_used[] __attribute((unused)) = {
  1724. 0x000000a5,
  1725. };
  1726. #define A_dsa_end 0x00000070
  1727. static u32 A_dsa_end_used[] __attribute((unused)) = {
  1728. };
  1729. #define A_dsa_fields_start 0x00000000
  1730. static u32 A_dsa_fields_start_used[] __attribute((unused)) = {
  1731. };
  1732. #define A_dsa_msgin 0x00000058
  1733. static u32 A_dsa_msgin_used[] __attribute((unused)) = {
  1734. 0x00000188,
  1735. };
  1736. #define A_dsa_msgout 0x00000040
  1737. static u32 A_dsa_msgout_used[] __attribute((unused)) = {
  1738. 0x00000086,
  1739. };
  1740. #define A_dsa_msgout_other 0x00000068
  1741. static u32 A_dsa_msgout_other_used[] __attribute((unused)) = {
  1742. 0x00000180,
  1743. };
  1744. #define A_dsa_next 0x00000030
  1745. static u32 A_dsa_next_used[] __attribute((unused)) = {
  1746. 0x0000005c,
  1747. };
  1748. #define A_dsa_restore_pointers 0x00000000
  1749. static u32 A_dsa_restore_pointers_used[] __attribute((unused)) = {
  1750. 0x0000012e,
  1751. };
  1752. #define A_dsa_save_data_pointer 0x00000000
  1753. static u32 A_dsa_save_data_pointer_used[] __attribute((unused)) = {
  1754. 0x00000115,
  1755. };
  1756. #define A_dsa_select 0x0000003c
  1757. static u32 A_dsa_select_used[] __attribute((unused)) = {
  1758. 0x00000081,
  1759. };
  1760. #define A_dsa_status 0x00000060
  1761. static u32 A_dsa_status_used[] __attribute((unused)) = {
  1762. 0x00000184,
  1763. };
  1764. #define A_dsa_temp_addr_array_value 0x00000000
  1765. static u32 A_dsa_temp_addr_array_value_used[] __attribute((unused)) = {
  1766. };
  1767. #define A_dsa_temp_addr_dsa_value 0x00000000
  1768. static u32 A_dsa_temp_addr_dsa_value_used[] __attribute((unused)) = {
  1769. 0x00000003,
  1770. };
  1771. #define A_dsa_temp_addr_new_value 0x00000000
  1772. static u32 A_dsa_temp_addr_new_value_used[] __attribute((unused)) = {
  1773. };
  1774. #define A_dsa_temp_addr_next 0x00000000
  1775. static u32 A_dsa_temp_addr_next_used[] __attribute((unused)) = {
  1776. 0x00000015,
  1777. 0x0000004e,
  1778. };
  1779. #define A_dsa_temp_addr_residual 0x00000000
  1780. static u32 A_dsa_temp_addr_residual_used[] __attribute((unused)) = {
  1781. 0x0000002a,
  1782. 0x00000039,
  1783. };
  1784. #define A_dsa_temp_addr_saved_pointer 0x00000000
  1785. static u32 A_dsa_temp_addr_saved_pointer_used[] __attribute((unused)) = {
  1786. 0x00000026,
  1787. 0x00000033,
  1788. };
  1789. #define A_dsa_temp_addr_saved_residual 0x00000000
  1790. static u32 A_dsa_temp_addr_saved_residual_used[] __attribute((unused)) = {
  1791. 0x0000002b,
  1792. 0x00000038,
  1793. };
  1794. #define A_dsa_temp_lun 0x00000000
  1795. static u32 A_dsa_temp_lun_used[] __attribute((unused)) = {
  1796. 0x0000004b,
  1797. };
  1798. #define A_dsa_temp_next 0x00000000
  1799. static u32 A_dsa_temp_next_used[] __attribute((unused)) = {
  1800. 0x0000001a,
  1801. };
  1802. #define A_dsa_temp_sync 0x00000000
  1803. static u32 A_dsa_temp_sync_used[] __attribute((unused)) = {
  1804. 0x00000053,
  1805. };
  1806. #define A_dsa_temp_target 0x00000000
  1807. static u32 A_dsa_temp_target_used[] __attribute((unused)) = {
  1808. 0x00000040,
  1809. };
  1810. #define A_int_debug_break 0x03000000
  1811. static u32 A_int_debug_break_used[] __attribute((unused)) = {
  1812. 0x00000217,
  1813. };
  1814. #define A_int_debug_panic 0x030b0000
  1815. static u32 A_int_debug_panic_used[] __attribute((unused)) = {
  1816. 0x000001e8,
  1817. 0x000001f8,
  1818. };
  1819. #define A_int_err_check_condition 0x00030000
  1820. static u32 A_int_err_check_condition_used[] __attribute((unused)) = {
  1821. 0x00000194,
  1822. };
  1823. #define A_int_err_no_phase 0x00040000
  1824. static u32 A_int_err_no_phase_used[] __attribute((unused)) = {
  1825. };
  1826. #define A_int_err_selected 0x00010000
  1827. static u32 A_int_err_selected_used[] __attribute((unused)) = {
  1828. 0x000001da,
  1829. };
  1830. #define A_int_err_unexpected_phase 0x00000000
  1831. static u32 A_int_err_unexpected_phase_used[] __attribute((unused)) = {
  1832. 0x0000008c,
  1833. 0x00000092,
  1834. 0x0000009a,
  1835. 0x000000d0,
  1836. 0x000000d4,
  1837. 0x000000d6,
  1838. 0x000000de,
  1839. 0x000000e2,
  1840. 0x000000e4,
  1841. 0x000000ec,
  1842. 0x000000f0,
  1843. 0x000000f2,
  1844. 0x000000f4,
  1845. 0x0000014c,
  1846. };
  1847. #define A_int_err_unexpected_reselect 0x00020000
  1848. static u32 A_int_err_unexpected_reselect_used[] __attribute((unused)) = {
  1849. 0x000001ba,
  1850. };
  1851. #define A_int_msg_1 0x01020000
  1852. static u32 A_int_msg_1_used[] __attribute((unused)) = {
  1853. 0x0000010e,
  1854. 0x00000110,
  1855. };
  1856. #define A_int_msg_sdtr 0x01010000
  1857. static u32 A_int_msg_sdtr_used[] __attribute((unused)) = {
  1858. 0x0000016c,
  1859. };
  1860. #define A_int_msg_wdtr 0x01000000
  1861. static u32 A_int_msg_wdtr_used[] __attribute((unused)) = {
  1862. 0x00000160,
  1863. };
  1864. #define A_int_norm_aborted 0x02040000
  1865. static u32 A_int_norm_aborted_used[] __attribute((unused)) = {
  1866. 0x0000024d,
  1867. };
  1868. #define A_int_norm_command_complete 0x02020000
  1869. static u32 A_int_norm_command_complete_used[] __attribute((unused)) = {
  1870. };
  1871. #define A_int_norm_disconnected 0x02030000
  1872. static u32 A_int_norm_disconnected_used[] __attribute((unused)) = {
  1873. };
  1874. #define A_int_norm_reselect_complete 0x02010000
  1875. static u32 A_int_norm_reselect_complete_used[] __attribute((unused)) = {
  1876. };
  1877. #define A_int_norm_reset 0x02050000
  1878. static u32 A_int_norm_reset_used[] __attribute((unused)) = {
  1879. };
  1880. #define A_int_norm_select_complete 0x02000000
  1881. static u32 A_int_norm_select_complete_used[] __attribute((unused)) = {
  1882. };
  1883. #define A_int_test_1 0x04000000
  1884. static u32 A_int_test_1_used[] __attribute((unused)) = {
  1885. 0x000001fd,
  1886. };
  1887. #define A_int_test_2 0x04010000
  1888. static u32 A_int_test_2_used[] __attribute((unused)) = {
  1889. 0x00000215,
  1890. };
  1891. #define A_int_test_3 0x04020000
  1892. static u32 A_int_test_3_used[] __attribute((unused)) = {
  1893. };
  1894. #define A_msg_buf 0x00000000
  1895. static u32 A_msg_buf_used[] __attribute((unused)) = {
  1896. 0x00000102,
  1897. 0x0000014e,
  1898. 0x00000158,
  1899. 0x0000015e,
  1900. 0x00000164,
  1901. 0x0000016a,
  1902. };
  1903. #define A_reconnect_dsa_head 0x00000000
  1904. static u32 A_reconnect_dsa_head_used[] __attribute((unused)) = {
  1905. 0x0000006c,
  1906. 0x00000074,
  1907. 0x000001a0,
  1908. };
  1909. #define A_reselected_identify 0x00000000
  1910. static u32 A_reselected_identify_used[] __attribute((unused)) = {
  1911. 0x00000045,
  1912. 0x0000019c,
  1913. };
  1914. #define A_reselected_tag 0x00000000
  1915. static u32 A_reselected_tag_used[] __attribute((unused)) = {
  1916. };
  1917. #define A_schedule 0x00000000
  1918. static u32 A_schedule_used[] __attribute((unused)) = {
  1919. 0x0000007e,
  1920. 0x00000192,
  1921. 0x000001e2,
  1922. 0x0000021f,
  1923. };
  1924. #define A_test_dest 0x00000000
  1925. static u32 A_test_dest_used[] __attribute((unused)) = {
  1926. 0x000001fb,
  1927. };
  1928. #define A_test_src 0x00000000
  1929. static u32 A_test_src_used[] __attribute((unused)) = {
  1930. 0x000001fa,
  1931. };
  1932. #define Ent_accept_message 0x000005d4
  1933. #define Ent_cmdout_cmdout 0x0000024c
  1934. #define Ent_command_complete 0x0000060c
  1935. #define Ent_command_complete_msgin 0x0000061c
  1936. #define Ent_data_transfer 0x00000254
  1937. #define Ent_datain_to_jump 0x00000328
  1938. #define Ent_debug_break 0x00000858
  1939. #define Ent_dsa_code_begin 0x00000000
  1940. #define Ent_dsa_code_check_reselect 0x000000f8
  1941. #define Ent_dsa_code_fix_jump 0x0000003c
  1942. #define Ent_dsa_code_restore_pointers 0x000000c0
  1943. #define Ent_dsa_code_save_data_pointer 0x00000088
  1944. #define Ent_dsa_code_template 0x00000000
  1945. #define Ent_dsa_code_template_end 0x00000168
  1946. #define Ent_dsa_schedule 0x00000168
  1947. #define Ent_dsa_zero 0x00000168
  1948. #define Ent_end_data_transfer 0x0000028c
  1949. #define Ent_initiator_abort 0x00000880
  1950. #define Ent_msg_in 0x00000404
  1951. #define Ent_msg_in_restart 0x000003e4
  1952. #define Ent_other_in 0x00000374
  1953. #define Ent_other_out 0x0000033c
  1954. #define Ent_other_transfer 0x000003ac
  1955. #define Ent_reject_message 0x000005b4
  1956. #define Ent_reselected_check_next 0x000006a4
  1957. #define Ent_reselected_ok 0x00000750
  1958. #define Ent_respond_message 0x000005ec
  1959. #define Ent_select 0x000001fc
  1960. #define Ent_select_msgout 0x00000214
  1961. #define Ent_target_abort 0x00000860
  1962. #define Ent_test_1 0x000007e4
  1963. #define Ent_test_2 0x000007f8
  1964. #define Ent_test_2_msgout 0x00000810
  1965. #define Ent_wait_reselect 0x00000654
  1966. static u32 LABELPATCHES[] __attribute((unused)) = {
  1967. 0x00000008,
  1968. 0x0000000a,
  1969. 0x00000013,
  1970. 0x00000016,
  1971. 0x0000001f,
  1972. 0x00000021,
  1973. 0x0000004f,
  1974. 0x00000051,
  1975. 0x0000005b,
  1976. 0x00000068,
  1977. 0x0000006f,
  1978. 0x00000082,
  1979. 0x00000084,
  1980. 0x0000008a,
  1981. 0x0000008e,
  1982. 0x00000090,
  1983. 0x00000096,
  1984. 0x00000098,
  1985. 0x0000009c,
  1986. 0x0000009e,
  1987. 0x000000a0,
  1988. 0x000000a2,
  1989. 0x000000a4,
  1990. 0x000000b1,
  1991. 0x000000b6,
  1992. 0x000000ba,
  1993. 0x000000c7,
  1994. 0x000000cc,
  1995. 0x000000d2,
  1996. 0x000000d8,
  1997. 0x000000da,
  1998. 0x000000e0,
  1999. 0x000000e6,
  2000. 0x000000e8,
  2001. 0x000000ee,
  2002. 0x000000f6,
  2003. 0x000000f8,
  2004. 0x00000104,
  2005. 0x00000106,
  2006. 0x00000108,
  2007. 0x0000010a,
  2008. 0x0000010c,
  2009. 0x00000112,
  2010. 0x00000114,
  2011. 0x00000129,
  2012. 0x00000142,
  2013. 0x00000148,
  2014. 0x00000150,
  2015. 0x00000152,
  2016. 0x00000154,
  2017. 0x0000015a,
  2018. 0x00000166,
  2019. 0x00000196,
  2020. 0x000001a5,
  2021. 0x000001a8,
  2022. 0x000001ac,
  2023. 0x000001b0,
  2024. 0x000001b4,
  2025. 0x000001b8,
  2026. 0x000001cf,
  2027. 0x000001de,
  2028. 0x000001e6,
  2029. 0x000001ec,
  2030. 0x000001ee,
  2031. 0x000001f2,
  2032. 0x000001f6,
  2033. 0x00000201,
  2034. 0x00000203,
  2035. 0x00000223,
  2036. 0x00000225,
  2037. 0x00000227,
  2038. 0x00000229,
  2039. 0x0000022b,
  2040. 0x0000022d,
  2041. 0x00000231,
  2042. 0x00000235,
  2043. 0x00000237,
  2044. 0x0000023b,
  2045. 0x0000023d,
  2046. 0x00000241,
  2047. 0x00000243,
  2048. };
  2049. static struct {
  2050. u32 offset;
  2051. void *address;
  2052. } EXTERNAL_PATCHES[] __attribute((unused)) = {
  2053. };
  2054. static u32 INSTRUCTIONS __attribute((unused)) = 301;
  2055. static u32 PATCHES __attribute((unused)) = 81;
  2056. static u32 EXTERNAL_PATCHES_LEN __attribute((unused)) = 0;