diff options
Diffstat (limited to 'sys/dev/microcode')
| -rw-r--r-- | sys/dev/microcode/aic7xxx/aic79xx.reg | 51 | ||||
| -rw-r--r-- | sys/dev/microcode/aic7xxx/aic79xx.seq | 337 | ||||
| -rw-r--r-- | sys/dev/microcode/aic7xxx/aic79xx_reg.h | 127 | ||||
| -rw-r--r-- | sys/dev/microcode/aic7xxx/aic79xx_seq.h | 1108 |
4 files changed, 834 insertions, 789 deletions
diff --git a/sys/dev/microcode/aic7xxx/aic79xx.reg b/sys/dev/microcode/aic7xxx/aic79xx.reg index b3cd742428e..5470278cffa 100644 --- a/sys/dev/microcode/aic7xxx/aic79xx.reg +++ b/sys/dev/microcode/aic7xxx/aic79xx.reg @@ -1,3 +1,5 @@ +/* $NetBSD: aic79xx.reg,v 1.4 2003/08/29 00:10:01 thorpej Exp $ */ + /* * Aic79xx register and scratch ram definitions. * @@ -37,9 +39,9 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.reg,v 1.10 2003/03/25 22:16:27 scottl Exp $ + * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.reg,v 1.11 2003/05/04 00:20:07 gibbs Exp $ */ -VERSION = "$NetBSD: aic79xx.reg,v 1.3 2003/05/14 12:57:46 wiz Exp $" +VERSION = "Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $" /* * This file is processed by the aic7xxx_asm utility for use in assembling @@ -194,7 +196,8 @@ register SEQINTCODE { TRACEPOINT1, TRACEPOINT2, TRACEPOINT3, - SAW_HWERR + SAW_HWERR, + BAD_SCB_STATUS } } @@ -3484,9 +3487,6 @@ scratch_ram { LONGJMP_ADDR { size 2 } - LONGJMP_SCB { - size 2 - } ACCUM_SAVE { size 1 } @@ -3799,23 +3799,6 @@ scb { size 4 alias SCB_NEXT_COMPLETE } - SCB_TAG { - size 2 - } - SCB_CDB_LEN { - size 1 - field SCB_CDB_LEN_PTR 0x80 /* CDB in host memory */ - } - SCB_TASK_MANAGEMENT { - size 1 - } - SCB_NEXT { - alias SCB_NEXT_SCB_BUSADDR - size 2 - } - SCB_NEXT2 { - size 2 - } SCB_DATAPTR { size 8 } @@ -3834,6 +3817,16 @@ scb { field SG_FULL_RESID 0x02 /* In the first byte */ field SG_LIST_NULL 0x01 /* In the first byte */ } + SCB_BUSADDR { + size 4 + } + SCB_NEXT { + alias SCB_NEXT_SCB_BUSADDR + size 2 + } + SCB_NEXT2 { + size 2 + } SCB_CONTROL { size 1 field TARGET_SCB 0x80 @@ -3856,8 +3849,16 @@ scb { SCB_TASK_ATTRIBUTE { size 1 } - SCB_BUSADDR { - size 4 + SCB_CDB_LEN { + size 1 + field SCB_CDB_LEN_PTR 0x80 /* CDB in host memory */ + } + SCB_TASK_MANAGEMENT { + size 1 + } + SCB_TAG { + alias SCB_FIFO_USE_COUNT + size 2 } SCB_SPARE { size 8 diff --git a/sys/dev/microcode/aic7xxx/aic79xx.seq b/sys/dev/microcode/aic7xxx/aic79xx.seq index c92ac5e9db6..ac1838e7f94 100644 --- a/sys/dev/microcode/aic7xxx/aic79xx.seq +++ b/sys/dev/microcode/aic7xxx/aic79xx.seq @@ -1,3 +1,5 @@ +/* $NetBSD: aic79xx.seq,v 1.4 2003/08/29 00:10:01 thorpej Exp $ */ + /* * Adaptec U320 device driver firmware for Linux and FreeBSD. * @@ -37,10 +39,10 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $FreeBSD: /repoman/r/ncvs/src/sys/dev/aic7xxx/aic79xx.seq,v 1.7 2003/02/27 23:23:16 gibbs Exp $ + * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.seq,v 1.8 2003/05/04 00:20:07 gibbs Exp $ */ -VERSION = "$NetBSD: aic79xx.seq,v 1.3 2003/05/14 12:57:46 wiz Exp $" +VERSION = "Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $" PATCH_ARG_LIST = "struct ahd_softc *ahd" PREFIX = "ahd_" @@ -89,6 +91,13 @@ END_CRITICAL; idle_loop_check_nonpackreq: test SSTAT2, NONPACKREQ jz . + 2; call unexpected_nonpkt_phase_find_ctxt; + if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) { + and A, FIFO0FREE|FIFO1FREE, DFFSTAT; + cmp A, FIFO0FREE|FIFO1FREE jne . + 3; + and SBLKCTL, ~DIAGLEDEN|DIAGLEDON; + jmp . + 2; + or SBLKCTL, DIAGLEDEN|DIAGLEDON; + } call idle_loop_gsfifo_in_scsi_mode; call idle_loop_service_fifos; call idle_loop_cchan; @@ -101,8 +110,8 @@ idle_loop_gsfifo_in_scsi_mode: test LQISTAT2, LQIGSAVAIL jz return; /* * We have received good status for this transaction. There may - * still be data in our FIFOs draining to the host. Setup - * monitoring of the draining process or complete the SCB. + * still be data in our FIFOs draining to the host. Complete + * the SCB only if all data has transferred to the host. */ good_status_IU_done: bmov SCBPTR, GSFIFO, 2; @@ -128,42 +137,20 @@ gsfifo_complete_normally: * 1) Configured and draining to the host, with a FIFO handler. * 2) Pending cfg4data, fifo not empty. * - * Case 1 can be detected by noticing that a longjmp is active for - * the FIFO and LONGJMP_SCB matches our SCB. In this case, we allow - * the routine servicing the FIFO to complete the SCB. + * Case 1 can be detected by noticing a non-zero FIFO active + * count in the SCB. In this case, we allow the routine servicing + * the FIFO to complete the SCB. * * Case 2 implies either a pending or yet to occur save data * pointers for this same context in the other FIFO. So, if * we detect case 1, we will properly defer the post of the SCB * and achieve the desired result. The pending cfg4data will * notice that status has been received and complete the SCB. - * - * If the data-transfer has been completed, or no data transfer - * was needed for this SCB, it is safe to complete the command. - */ - test SCB_SGPTR, SG_LIST_NULL jz good_status_check_fifos; - /* - * All segments have been loaded (or no data transfer), so - * it is safe to complete the command. Since this was a - * cheap command to check for completion, loop to see if - * more entries can be removed from the GSFIFO. */ + test SCB_FIFO_USE_COUNT, 0xFF jnz idle_loop_gsfifo_in_scsi_mode; call complete; END_CRITICAL; jmp idle_loop_gsfifo_in_scsi_mode; -BEGIN_CRITICAL; -good_status_check_fifos: - clc; - bmov ARG_1, SCBPTR, 2; - SET_MODE(M_DFF0, M_DFF0) - call check_fifo; - jc return; - SET_MODE(M_DFF1, M_DFF1) - call check_fifo; - jc return; - SET_MODE(M_SCSI, M_SCSI) - jmp queue_scb_completion; -END_CRITICAL; idle_loop_service_fifos: SET_MODE(M_DFF0, M_DFF0) @@ -172,6 +159,7 @@ idle_loop_service_fifos: idle_loop_next_fifo: SET_MODE(M_DFF1, M_DFF1) test LONGJMP_ADDR[1], INVALID_ADDR jz longjmp; +return: ret; idle_loop_cchan: @@ -189,12 +177,31 @@ END_CRITICAL; scbdma_tohost_done: test CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone; /* - * A complete SCB upload requires no intervention. - * The SCB is already on the COMPLETE_SCB list - * and its completion notification will now be - * handled just like any other SCB. + * An SCB has been succesfully uploaded to the host. + * If the SCB was uploaded for some reason other than + * bad SCSI status (currently only for underruns), we + * queue the SCB for normal completion. Otherwise, we + * wait until any select-out activity has halted, and + * then notify the host so that the transaction can be + * dealt with. + */ + test SCB_SCSI_STATUS, 0xff jnz scbdma_notify_host; + and CCSCBCTL, ~(CCARREN|CCSCBEN); + bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2; + bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2; + bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret; +scbdma_notify_host: + SET_MODE(M_SCSI, M_SCSI) + test SCSISEQ0, ENSELO jnz return; + test SSTAT0, (SELDO|SELINGO) jnz return; + SET_MODE(M_CCHAN, M_CCHAN) + /* + * Remove SCB and notify host. */ - and CCSCBCTL, ~(CCARREN|CCSCBEN) ret; + and CCSCBCTL, ~(CCARREN|CCSCBEN); + bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2; + SET_SEQINTCODE(BAD_SCB_STATUS) + ret; fill_qoutfifo_dmadone: and CCSCBCTL, ~(CCARREN|CCSCBEN); call qoutfifo_updated; @@ -256,6 +263,13 @@ fetch_new_scb_done: clr A; add CMDS_PENDING, 1; adc CMDS_PENDING[1], A; + /* + * The FIFO use count field is shared with the + * tag set by the host so that our SCB dma engine + * knows the correct location to store the SCB. + * Set it to zero before processing the SCB. + */ + mov SCB_FIFO_USE_COUNT, ALLZEROS; /* Update the next SCB address to download. */ bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4; mvi SCB_NEXT[1], SCB_LIST_NULL; @@ -332,15 +346,7 @@ fetch_new_scb: dma_complete_scb: bmov SCBPTR, COMPLETE_DMA_SCB_HEAD, 2; bmov SCBHADDR, SCB_BUSADDR, 4; - mvi CCARREN|CCSCBEN|CCSCBRESET call dma_scb; - /* - * Now that we've started the DMA, push us onto - * the normal completion queue to have our SCBID - * posted to the kernel. - */ - bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2; - bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2; - bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret; + mvi CCARREN|CCSCBEN|CCSCBRESET jmp dma_scb; END_CRITICAL; /* @@ -359,8 +365,6 @@ dma_scb: mov CCSCBCTL, SINDEX ret; BEGIN_CRITICAL; -setjmp_setscb: - bmov LONGJMP_SCB, SCBPTR, 2; setjmp: bmov LONGJMP_ADDR, STACK, 2 ret; setjmp_inline: @@ -1028,9 +1032,18 @@ freeze_queue: or SEQ_FLAGS2, SELECTOUT_QFROZEN; mov A, ACCUM_SAVE ret; -queue_arg1_scb_completion: +/* + * Complete the current FIFO's SCB if data for this same + * SCB is not transferring in the other FIFO. + */ +SET_SRC_MODE M_DFF1; +SET_DST_MODE M_DFF1; +pkt_complete_scb_if_fifos_idle: + bmov ARG_1, SCBPTR, 2; + mvi DFFSXFRCTL, CLRCHN; SET_MODE(M_SCSI, M_SCSI) bmov SCBPTR, ARG_1, 2; + test SCB_FIFO_USE_COUNT, 0xFF jnz return; queue_scb_completion: test SCB_SCSI_STATUS,0xff jnz bad_status; /* @@ -1046,6 +1059,12 @@ bad_status: cmp SCB_SCSI_STATUS, STATUS_PKT_SENSE je upload_scb; call freeze_queue; upload_scb: + /* + * Restore SCB TAG since we reuse this field + * in the sequencer. We don't want to corrupt + * it on the host. + */ + bmov SCB_TAG, SCBPTR, 2; bmov SCB_NEXT_COMPLETE, COMPLETE_DMA_SCB_HEAD, 2; bmov COMPLETE_DMA_SCB_HEAD, SCBPTR, 2; or SCB_SGPTR, SG_STATUS_VALID ret; @@ -1356,7 +1375,7 @@ load_first_seg: clr SG_STATE ret; p_data_handle_xfer: - call setjmp_setscb; + call setjmp; test SG_STATE, LOADING_NEEDED jnz service_fifo; p_data_clear_handler: or LONGJMP_ADDR[1], INVALID_ADDR ret; @@ -1609,25 +1628,32 @@ export seq_isr: * and deffer the test by one instruction. */ mov REG_ISR, LQISTAT2; - test REG_ISR, LQIWORKONLQ jz data_valid; - test SEQINTSRC, SAVEPTRS jz data_valid; + test REG_ISR, LQIWORKONLQ jz main_isr; + test SEQINTSRC, SAVEPTRS jz main_isr; test LONGJMP_ADDR[1], INVALID_ADDR jz saveptr_active_fifo; /* - * Switch to the active FIFO. + * Switch to the active FIFO after clearing the snapshot + * savepointer in the current FIFO. We do this so that + * a pending CTXTDONE or SAVEPTR is visible in the active + * FIFO. This status is the only way we can detect if we + * have lost the race (e.g. host paused us) and our attepts + * to disable the channel occurred after all REQs were + * already seen and acked (REQINIT never comes true). */ + mvi DFFSXFRCTL, CLRCHN; xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); - test DFCNTRL, DIRECTION jz snapshot_other_fifo; + test DFCNTRL, DIRECTION jz interrupt_return; and DFCNTRL, ~SCSIEN; - test SSTAT1, REQINIT jz .; +snapshot_wait_data_valid: + test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz snapshot_data_valid; + test SSTAT1, REQINIT jz snapshot_wait_data_valid; +snapshot_data_valid: or DFCNTRL, SCSIEN; - /* FALLTHROUGH */ -snapshot_other_fifo: - xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); - /* FALLTHROUGH */ + or SEQINTCTL, IRET ret; snapshot_saveptr: mvi DFFSXFRCTL, CLRCHN; or SEQINTCTL, IRET ret; -data_valid: +main_isr: } test SEQINTSRC, CFG4DATA jnz cfg4data_intr; test SEQINTSRC, CFG4ISTAT jnz cfg4istat_intr; @@ -1660,9 +1686,11 @@ saveptr_active_fifo: or SEQINTCTL, IRET ret; cfg4data_intr: - test SCB_SGPTR[0], SG_LIST_NULL jnz pkt_handle_overrun; + test SCB_SGPTR[0], SG_LIST_NULL jnz pkt_handle_overrun_inc_use_count; call load_first_seg; call pkt_handle_xfer; + inc SCB_FIFO_USE_COUNT; +interrupt_return: or SEQINTCTL, IRET ret; cfg4istat_intr: @@ -1722,7 +1750,6 @@ cfg4icmd_intr: test DFSTATUS, FIFOEMP jz pkt_handle_overrun pkt_handle_xfer: - bmov LONGJMP_SCB, SCBPTR, 2; test SG_STATE, LOADING_NEEDED jz pkt_last_seg; call setjmp; test SEQINTSRC, SAVEPTRS jnz pkt_saveptrs; @@ -1744,7 +1771,7 @@ pkt_service_fifo: pkt_last_seg: call setjmp; test SEQINTSRC, SAVEPTRS jnz pkt_saveptrs; - test SG_CACHE_SHADOW, LAST_SEG_DONE jnz last_pkt_xfer_done; + test SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_last_seg_done; test SCSIPHASE, ~DATA_PHASE_MASK jz . + 2; test SCSISIGO, ATNO jnz . + 2; test SSTAT2, NONPACKREQ jz return; @@ -1753,7 +1780,7 @@ pkt_last_seg: /* * Either a SAVEPTRS interrupt condition is pending for this FIFO - * or we have a pending nonpackreq for this FIFO. We differentiate + * or we have a pending NONPACKREQ for this FIFO. We differentiate * between the two by capturing the state of the SAVEPTRS interrupt * prior to clearing this status and executing the common code for * these two cases. @@ -1782,118 +1809,134 @@ pkt_saveptrs_wait_fifoemp: pkt_saveptrs_check_status: or LONGJMP_ADDR[1], INVALID_ADDR; test REG0, SAVEPTRS jz unexpected_nonpkt_phase; - test SCB_CONTROL, STATUS_RCVD jz pkt_saveptrs_clrchn; - jmp last_pkt_complete; -pkt_saveptrs_clrchn: + dec SCB_FIFO_USE_COUNT; + test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle; mvi DFFSXFRCTL, CLRCHN ret; END_CRITICAL; -last_pkt_xfer_done: +/* + * LAST_SEG_DONE status has been seen in the current FIFO. + * This indicates that all of the allowed data for this + * command has transferred across the SCSI and host buses. + * Check for overrun and see if we can complete this command. + */ +pkt_last_seg_done: BEGIN_CRITICAL; - if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) { - or DFCNTRL, FIFOFLUSH; - } - test SCB_CONTROL, STATUS_RCVD jz wait_pkt_end; - check_overrun; - or SCB_SGPTR, SG_LIST_NULL; /* - * It is safe to skip the other FIFO check since - * we defer CLRCHN on SAVEPTRS until all data in - * the FIFO are seen by the host and a CFG4DATA - * in this FIFO for the same context is held off - * by hardware. + * Mark transfer as completed. */ -last_pkt_queue_scb: - or LONGJMP_ADDR[1], INVALID_ADDR; - bmov ARG_1, SCBPTR, 2; - mvi DFFSXFRCTL, CLRCHN; - jmp queue_arg1_scb_completion; - -last_pkt_complete: - bmov ARG_1, SCBPTR, 2; - mvi DFFSXFRCTL, CLRCHN; -check_other_fifo: - clc; - TOGGLE_DFF_MODE - call check_fifo; - jnc queue_arg1_scb_completion; -return: - ret; + or SCB_SGPTR, SG_LIST_NULL; -wait_pkt_end: + /* + * Wait for the current context to finish to verify that + * no overrun condition has occurred. + */ + test SEQINTSRC, CTXTDONE jnz pkt_ctxt_done; call setjmp; -END_CRITICAL; -wait_pkt_end_loop: - test SEQINTSRC, CTXTDONE jnz pkt_end; +pkt_wait_ctxt_done_loop: + test SEQINTSRC, CTXTDONE jnz pkt_ctxt_done; + /* + * A sufficiently large overrun or a NONPACKREQ may + * prevent CTXTDONE from ever asserting, so we must + * poll for these statuses too. + */ check_overrun; test SSTAT2, NONPACKREQ jz return; test SEQINTSRC, CTXTDONE jz unexpected_nonpkt_phase; -pkt_end: -BEGIN_CRITICAL; + /* FALLTHROUGH */ + +pkt_ctxt_done: check_overrun; or LONGJMP_ADDR[1], INVALID_ADDR; - or SCB_SGPTR, SG_LIST_NULL; - test SCB_CONTROL, STATUS_RCVD jnz last_pkt_complete; + /* + * If status has been received, it is safe to skip + * the check to see if another FIFO is active because + * LAST_SEG_DONE has been observed. However, we check + * the FIFO anyway since it costs us only one extra + * instruction to leverage common code to perform the + * SCB completion. + */ + dec SCB_FIFO_USE_COUNT; + test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle; mvi DFFSXFRCTL, CLRCHN ret; END_CRITICAL; /* + * Must wait until CDB xfer is over before issuing the + * clear channel. + */ +pkt_handle_cdb: + call setjmp; + test SG_CACHE_SHADOW, LAST_SEG_DONE jz return; + or LONGJMP_ADDR[1], INVALID_ADDR; + mvi DFFSXFRCTL, CLRCHN ret; + +/* * Watch over the status transfer. Our host sense buffer is * large enough to take the maximum allowed status packet. * None-the-less, we must still catch and report overruns to - * the host. + * the host. Additionally, properly catch unexpected non-packet + * phases that are typically caused by CRC errors in status packet + * transmission. */ pkt_handle_status: - call setjmp_setscb; - test SG_CACHE_SHADOW, LAST_SEG_DONE jz check_status_overrun; - test SEQINTSRC, CTXTDONE jz return; -status_IU_done: -BEGIN_CRITICAL; + call setjmp; + test SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_status_check_overrun; + test SEQINTSRC, CTXTDONE jz pkt_status_check_nonpackreq; + test SG_CACHE_SHADOW, LAST_SEG_DONE jnz pkt_status_check_overrun; +pkt_status_IU_done: if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) { or DFCNTRL, FIFOFLUSH; } + test DFSTATUS, FIFOEMP jz return; +BEGIN_CRITICAL; or LONGJMP_ADDR[1], INVALID_ADDR; mvi SCB_SCSI_STATUS, STATUS_PKT_SENSE; or SCB_CONTROL, STATUS_RCVD; - jmp last_pkt_complete; + jmp pkt_complete_scb_if_fifos_idle; END_CRITICAL; -check_status_overrun: - /* - * We've filled the entire sense buffer. - * Wait for either context done or a negative - * shaddow count. If the context completes without - * causing the shaddow count to go negative, then - * this was a successful transfer up to the status - * limit. Otherwise we report the error. - */ - test SHCNT[2], 0xFF jnz report_status_overrun; - test SEQINTSRC, CTXTDONE jz return; - test SHCNT[2], 0xFF jz status_IU_done; -report_status_overrun: +pkt_status_check_overrun: + /* + * Status PKT overruns are uncerimoniously recovered with a + * bus reset. If we've overrun, let the host know so that + * recovery can be performed. + * + * LAST_SEG_DONE has been observed. If either CTXTDONE or + * a NONPACKREQ phase change have occurred and the FIFO is + * empty, there is no overrun. + */ + test DFSTATUS, FIFOEMP jz pkt_status_report_overrun; + test SEQINTSRC, CTXTDONE jz . + 2; + test DFSTATUS, FIFOEMP jnz pkt_status_IU_done; + test SCSIPHASE, ~DATA_PHASE_MASK jz return; + test DFSTATUS, FIFOEMP jnz pkt_status_check_nonpackreq; +pkt_status_report_overrun: SET_SEQINTCODE(STATUS_OVERRUN) - jmp status_IU_done; - -SET_SRC_MODE M_DFF0; -SET_DST_MODE M_DFF0; -BEGIN_CRITICAL; -check_fifo: - test LONGJMP_ADDR[1], INVALID_ADDR jnz return; - mov A, ARG_2; - cmp LONGJMP_SCB[1], A jne return; - mov A, ARG_1; - cmp LONGJMP_SCB[0], A jne return; - stc ret; -END_CRITICAL; - -/* - * Must wait until CDB xfer is over before issuing the - * clear channel. - */ -pkt_handle_cdb: - call setjmp_setscb; - test SG_CACHE_SHADOW, LAST_SEG_DONE jz return; - or LONGJMP_ADDR[1], INVALID_ADDR; - mvi DFFSXFRCTL, CLRCHN ret; + /* SEQUENCER RESTARTED */ +pkt_status_check_nonpackreq: + /* + * CTXTDONE may be held off if a NONPACKREQ is associated with + * the current context. If a NONPACKREQ is observed, decide + * if it is for the current context. If it is for the current + * context, we must defer NONPACKREQ processing until all data + * has transferred to the host. + */ + test SCSIPHASE, ~DATA_PHASE_MASK jz return; + test SCSISIGO, ATNO jnz . + 2; + test SSTAT2, NONPACKREQ jz return; + test SEQINTSRC, CTXTDONE jnz pkt_status_IU_done; + test DFSTATUS, FIFOEMP jz return; + /* + * The unexpected nonpkt phase handler assumes that any + * data channel use will have a FIFO reference count. It + * turns out that the status handler doesn't need a refernce + * count since the status received flag, and thus completion + * processing, cannot be set until the handler is finished. + * We increment the count here to make the nonpkt handler + * happy. + */ + inc SCB_FIFO_USE_COUNT; + /* FALLTHROUGH */ /* * Nonpackreq is a polled status. It can come true in three situations: @@ -1922,6 +1965,7 @@ unexpected_nonpkt_phase: SET_SRC_MODE M_DFF0; SET_DST_MODE M_DFF0; or LONGJMP_ADDR[1], INVALID_ADDR; + dec SCB_FIFO_USE_COUNT; mvi DFFSXFRCTL, CLRCHN; mvi CLRSINT2, CLRNONPACKREQ; test SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase; @@ -1938,6 +1982,8 @@ illegal_phase: * data. Otherwise use an overrun buffer in the host to simulate * BITBUCKET. */ +pkt_handle_overrun_inc_use_count: + inc SCB_FIFO_USE_COUNT; pkt_handle_overrun: SET_SEQINTCODE(CFG4OVERRUN) call freeze_queue; @@ -1963,8 +2009,9 @@ overrun_load_done: pkt_overrun_end: or SCB_RESIDUAL_SGPTR, SG_OVERRUN_RESID; test SEQINTSRC, CTXTDONE jz unexpected_nonpkt_phase; - test SCB_CONTROL, STATUS_RCVD jnz last_pkt_queue_scb; + dec SCB_FIFO_USE_COUNT; or LONGJMP_ADDR[1], INVALID_ADDR; + test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle; mvi DFFSXFRCTL, CLRCHN ret; if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0) { diff --git a/sys/dev/microcode/aic7xxx/aic79xx_reg.h b/sys/dev/microcode/aic7xxx/aic79xx_reg.h index 4c437c05015..f709a642a38 100644 --- a/sys/dev/microcode/aic7xxx/aic79xx_reg.h +++ b/sys/dev/microcode/aic7xxx/aic79xx_reg.h @@ -2,8 +2,8 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $NetBSD: aic79xx_reg.h,v 1.3 2003/05/14 12:57:46 wiz Exp $ - * $NetBSD: aic79xx_reg.h,v 1.3 2003/05/14 12:57:46 wiz Exp $ + * Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $ + * Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $ */ typedef int (ahd_reg_print_t)(u_int, u_int *, u_int); typedef struct ahd_reg_parse_entry { @@ -1924,17 +1924,10 @@ ahd_reg_print_t ahd_longjmp_addr_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_longjmp_scb_print; -#else -#define ahd_longjmp_scb_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LONGJMP_SCB", 0xfa, regvalue, cur_col, wrap) -#endif - -#if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_accum_save_print; #else #define ahd_accum_save_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "ACCUM_SAVE", 0xfc, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "ACCUM_SAVE", 0xfa, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -2246,59 +2239,45 @@ ahd_reg_print_t ahd_scb_sense_busaddr_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_tag_print; -#else -#define ahd_scb_tag_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_TAG", 0x190, regvalue, cur_col, wrap) -#endif - -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_cdb_len_print; -#else -#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x192, regvalue, cur_col, wrap) -#endif - -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_task_management_print; +ahd_reg_print_t ahd_scb_dataptr_print; #else -#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x193, regvalue, cur_col, wrap) +#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x190, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_next_print; +ahd_reg_print_t ahd_scb_datacnt_print; #else -#define ahd_scb_next_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_NEXT", 0x194, regvalue, cur_col, wrap) +#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_DATACNT", 0x198, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_next2_print; +ahd_reg_print_t ahd_scb_sgptr_print; #else -#define ahd_scb_next2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_NEXT2", 0x196, regvalue, cur_col, wrap) +#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_SGPTR", 0x19c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_dataptr_print; +ahd_reg_print_t ahd_scb_busaddr_print; #else -#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x198, regvalue, cur_col, wrap) +#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1a0, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_datacnt_print; +ahd_reg_print_t ahd_scb_next_print; #else -#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_DATACNT", 0x1a0, regvalue, cur_col, wrap) +#define ahd_scb_next_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_NEXT", 0x1a4, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_sgptr_print; +ahd_reg_print_t ahd_scb_next2_print; #else -#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_SGPTR", 0x1a4, regvalue, cur_col, wrap) +#define ahd_scb_next2_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_NEXT2", 0x1a6, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -2330,10 +2309,24 @@ ahd_reg_print_t ahd_scb_task_attribute_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scb_busaddr_print; +ahd_reg_print_t ahd_scb_cdb_len_print; #else -#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1ac, regvalue, cur_col, wrap) +#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x1ac, regvalue, cur_col, wrap) +#endif + +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_scb_task_management_print; +#else +#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x1ad, regvalue, cur_col, wrap) +#endif + +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_scb_tag_print; +#else +#define ahd_scb_tag_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCB_TAG", 0x1ae, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -2367,6 +2360,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SPLTINT 0x01 #define SEQINTCODE 0x02 +#define BAD_SCB_STATUS 0x1a #define SAW_HWERR 0x19 #define TRACEPOINT3 0x18 #define TRACEPOINT2 0x17 @@ -2438,7 +2432,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define HS_MAILBOX 0x0b #define HOST_TQINPOS 0x80 -#define ENINT_COALESCE 0x40 +#define ENINT_COALESCE 0x40 #define SEQINTSTAT 0x0c #define SEQ_SWTMRTO 0x10 @@ -3508,9 +3502,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define LONGJMP_ADDR 0xf8 -#define LONGJMP_SCB 0xfa - -#define ACCUM_SAVE 0xfc +#define ACCUM_SAVE 0xfa #define AHD_PCI_CONFIG_BASE 0x100 @@ -3656,29 +3648,24 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SCB_SENSE_BUSADDR 0x18c #define SCB_NEXT_COMPLETE 0x18c -#define SCB_TAG 0x190 - -#define SCB_CDB_LEN 0x192 -#define SCB_CDB_LEN_PTR 0x80 - -#define SCB_TASK_MANAGEMENT 0x193 - -#define SCB_NEXT 0x194 -#define SCB_NEXT_SCB_BUSADDR 0x194 +#define SCB_DATAPTR 0x190 -#define SCB_NEXT2 0x196 - -#define SCB_DATAPTR 0x198 - -#define SCB_DATACNT 0x1a0 +#define SCB_DATACNT 0x198 #define SG_LAST_SEG 0x80 #define SG_HIGH_ADDR_BITS 0x7f -#define SCB_SGPTR 0x1a4 +#define SCB_SGPTR 0x19c #define SG_STATUS_VALID 0x04 #define SG_FULL_RESID 0x02 #define SG_LIST_NULL 0x01 +#define SCB_BUSADDR 0x1a0 + +#define SCB_NEXT 0x1a4 +#define SCB_NEXT_SCB_BUSADDR 0x1a4 + +#define SCB_NEXT2 0x1a6 + #define SCB_CONTROL 0x1a8 #define TARGET_SCB 0x80 #define DISCENB 0x40 @@ -3697,7 +3684,13 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SCB_TASK_ATTRIBUTE 0x1ab -#define SCB_BUSADDR 0x1ac +#define SCB_CDB_LEN 0x1ac +#define SCB_CDB_LEN_PTR 0x80 + +#define SCB_TASK_MANAGEMENT 0x1ad + +#define SCB_TAG 0x1ae +#define SCB_FIFO_USE_COUNT 0x1ae #define SCB_SPARE 0x1b0 #define SCB_PKT_LUN 0x1b0 @@ -3775,5 +3768,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; /* Exported Labels */ -#define LABEL_seq_isr 0x268 -#define LABEL_timer_isr 0x264 +#define LABEL_seq_isr 0x270 +#define LABEL_timer_isr 0x26c diff --git a/sys/dev/microcode/aic7xxx/aic79xx_seq.h b/sys/dev/microcode/aic7xxx/aic79xx_seq.h index fbf8805360d..210c6b53e93 100644 --- a/sys/dev/microcode/aic7xxx/aic79xx_seq.h +++ b/sys/dev/microcode/aic7xxx/aic79xx_seq.h @@ -2,97 +2,104 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $NetBSD: aic79xx_seq.h,v 1.2 2003/04/20 11:20:52 fvdl Exp $ - * $NetBSD: aic79xx_seq.h,v 1.2 2003/04/20 11:20:52 fvdl Exp $ + * Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $ + * Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $ */ static uint8_t seqprog[] = { 0xff, 0x02, 0x06, 0x78, - 0x00, 0xea, 0x46, 0x59, + 0x00, 0xea, 0x4e, 0x59, 0x01, 0xea, 0x04, 0x30, 0xff, 0x04, 0x0c, 0x78, - 0x19, 0xea, 0x46, 0x59, + 0x19, 0xea, 0x4e, 0x59, 0x19, 0xea, 0x04, 0x00, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x60, 0x3a, 0x1a, 0x68, 0x04, 0x47, 0x1b, 0x68, 0xff, 0x21, 0x1b, 0x70, - 0x40, 0x4b, 0x88, 0x69, - 0x00, 0xe2, 0x4a, 0x59, - 0x40, 0x4b, 0x88, 0x69, - 0x20, 0x4b, 0x78, 0x69, + 0x40, 0x4b, 0x90, 0x69, + 0x00, 0xe2, 0x52, 0x59, + 0x40, 0x4b, 0x90, 0x69, + 0x20, 0x4b, 0x80, 0x69, 0xfc, 0x42, 0x24, 0x78, 0x10, 0x40, 0x24, 0x78, - 0x00, 0xe2, 0xd6, 0x5d, + 0x00, 0xe2, 0xd2, 0x5d, 0x20, 0x4d, 0x28, 0x78, - 0x00, 0xe2, 0xd6, 0x5d, - 0x00, 0xe2, 0x34, 0x58, + 0x00, 0xe2, 0xd2, 0x5d, + 0x30, 0x3f, 0xc0, 0x09, + 0x30, 0xe0, 0x30, 0x60, + 0x7f, 0x4a, 0x94, 0x08, + 0x00, 0xe2, 0x32, 0x40, + 0xc0, 0x4a, 0x94, 0x00, + 0x00, 0xe2, 0x3e, 0x58, + 0x00, 0xe2, 0x56, 0x58, 0x00, 0xe2, 0x66, 0x58, - 0x00, 0xe2, 0x76, 0x58, 0x00, 0xe2, 0x06, 0x40, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x01, 0x52, 0x8c, 0x7d, + 0x01, 0x52, 0x64, 0x78, 0x02, 0x58, 0x50, 0x31, 0xff, 0xea, 0x10, 0x0b, - 0xff, 0x93, 0x45, 0x78, - 0x50, 0x4b, 0x40, 0x68, + 0xff, 0xad, 0x4f, 0x78, + 0x50, 0x4b, 0x4a, 0x68, 0xbf, 0x3a, 0x74, 0x08, - 0x14, 0xea, 0x46, 0x59, + 0x14, 0xea, 0x4e, 0x59, 0x14, 0xea, 0x04, 0x00, 0x08, 0xa8, 0x51, 0x03, - 0x01, 0xa4, 0x4d, 0x78, - 0x00, 0xe2, 0x42, 0x5b, - 0x00, 0xe2, 0x34, 0x40, - 0xff, 0xea, 0xd4, 0x19, - 0x02, 0xa8, 0x84, 0x32, - 0x00, 0xea, 0x3a, 0x59, - 0x01, 0xea, 0x00, 0x30, - 0x00, 0xe2, 0xc2, 0x5d, - 0x00, 0xe2, 0x8c, 0x4d, - 0x11, 0xea, 0x3a, 0x59, - 0x11, 0xea, 0x00, 0x00, - 0x00, 0xe2, 0xc2, 0x5d, - 0x00, 0xe2, 0x8c, 0x4d, - 0x33, 0xea, 0x3a, 0x59, - 0x33, 0xea, 0x00, 0x00, - 0x00, 0xe2, 0x3a, 0x43, - 0x00, 0xea, 0x3a, 0x59, + 0xff, 0xae, 0x3f, 0x68, + 0x00, 0xe2, 0x50, 0x5b, + 0x00, 0xe2, 0x3e, 0x40, + 0x00, 0xea, 0x42, 0x59, 0x01, 0xea, 0x00, 0x30, - 0x80, 0xf9, 0x6e, 0x68, - 0x00, 0xe2, 0x38, 0x59, - 0x11, 0xea, 0x3a, 0x59, + 0x80, 0xf9, 0x5e, 0x68, + 0x00, 0xe2, 0x40, 0x59, + 0x11, 0xea, 0x42, 0x59, 0x11, 0xea, 0x00, 0x00, - 0x80, 0xf9, 0x38, 0x79, + 0x80, 0xf9, 0x40, 0x79, 0xff, 0xea, 0xd4, 0x0d, - 0x22, 0xea, 0x3a, 0x59, + 0x22, 0xea, 0x42, 0x59, 0x22, 0xea, 0x00, 0x00, - 0x10, 0x16, 0x80, 0x78, + 0x10, 0x16, 0x70, 0x78, 0x01, 0x0b, 0xa2, 0x32, 0x10, 0x16, 0x2c, 0x00, - 0x18, 0xad, 0xee, 0x78, - 0x04, 0xad, 0xbc, 0x68, - 0x80, 0xad, 0x8c, 0x7d, - 0x10, 0xad, 0x8a, 0x78, - 0xe7, 0xad, 0x5a, 0x0d, + 0x18, 0xad, 0xfe, 0x78, + 0x04, 0xad, 0xca, 0x68, + 0x80, 0xad, 0x64, 0x78, + 0x10, 0xad, 0x98, 0x78, + 0xff, 0x88, 0x83, 0x68, 0xe7, 0xad, 0x5a, 0x09, - 0x00, 0xe2, 0x98, 0x58, + 0x02, 0x8c, 0x59, 0x32, + 0x02, 0x28, 0x19, 0x33, + 0x02, 0xa8, 0x50, 0x36, + 0x33, 0xea, 0x42, 0x59, + 0x33, 0xea, 0x00, 0x00, + 0x40, 0x3a, 0x64, 0x68, + 0x50, 0x4b, 0x64, 0x68, + 0x22, 0xea, 0x42, 0x59, + 0x22, 0xea, 0x00, 0x00, + 0xe7, 0xad, 0x5a, 0x09, + 0x02, 0x8c, 0x59, 0x32, + 0x1a, 0xea, 0x4e, 0x59, + 0x1a, 0xea, 0x04, 0x00, + 0xff, 0xea, 0xd4, 0x0d, + 0xe7, 0xad, 0x5a, 0x09, + 0x00, 0xe2, 0xa6, 0x58, 0xff, 0xea, 0x56, 0x02, 0x04, 0x7c, 0x78, 0x32, - 0x20, 0x16, 0x8c, 0x7d, + 0x20, 0x16, 0x64, 0x78, 0x04, 0x38, 0x79, 0x32, 0x80, 0x37, 0x6f, 0x16, - 0xff, 0x2d, 0xa7, 0x60, - 0xff, 0x29, 0xa7, 0x60, - 0x40, 0x51, 0xb7, 0x78, - 0xff, 0x4f, 0xa7, 0x68, + 0xff, 0x2d, 0xb5, 0x60, + 0xff, 0x29, 0xb5, 0x60, + 0x40, 0x51, 0xc5, 0x78, + 0xff, 0x4f, 0xb5, 0x68, 0xff, 0x4d, 0xc1, 0x19, 0x00, 0x4e, 0xd5, 0x19, - 0x00, 0xe2, 0xb6, 0x50, + 0x00, 0xe2, 0xc4, 0x50, 0x01, 0x4c, 0xc1, 0x31, 0x00, 0x50, 0xd5, 0x19, - 0x00, 0xe2, 0xb6, 0x48, - 0x80, 0x18, 0x8c, 0x7d, + 0x00, 0xe2, 0xc4, 0x48, + 0x80, 0x18, 0x64, 0x78, 0x02, 0x4a, 0x1d, 0x30, 0x10, 0xea, 0x18, 0x00, 0x60, 0x18, 0x30, 0x00, @@ -100,35 +107,36 @@ static uint8_t seqprog[] = { 0x02, 0xea, 0x02, 0x00, 0xff, 0xea, 0xa0, 0x0a, 0x80, 0x18, 0x30, 0x04, - 0x40, 0xad, 0x8c, 0x7d, + 0x40, 0xad, 0x64, 0x78, 0xe7, 0xad, 0x5a, 0x09, 0x02, 0xa8, 0x40, 0x31, 0xff, 0xea, 0xc0, 0x09, 0x01, 0x4e, 0x9d, 0x1a, 0x00, 0x4f, 0x9f, 0x22, - 0x04, 0x94, 0x49, 0x32, - 0xff, 0xea, 0x2a, 0x03, - 0xff, 0xea, 0x2e, 0x03, + 0x01, 0xea, 0x5c, 0x33, + 0x04, 0xa4, 0x49, 0x32, + 0xff, 0xea, 0x4a, 0x03, + 0xff, 0xea, 0x4e, 0x03, 0x01, 0x10, 0xd4, 0x31, - 0x10, 0xa8, 0xe3, 0x68, + 0x10, 0xa8, 0xf3, 0x68, 0x3d, 0xa9, 0xc5, 0x29, 0xfe, 0xe2, 0xc4, 0x09, 0x01, 0xea, 0xc6, 0x01, 0x02, 0xe2, 0xc8, 0x31, 0x02, 0xec, 0x50, 0x31, 0x02, 0xa0, 0xda, 0x31, - 0xff, 0xa9, 0xe2, 0x70, - 0x02, 0xa0, 0x28, 0x37, - 0xff, 0x21, 0xeb, 0x70, + 0xff, 0xa9, 0xf2, 0x70, + 0x02, 0xa0, 0x48, 0x37, + 0xff, 0x21, 0xfb, 0x70, 0x02, 0x22, 0x51, 0x31, - 0x02, 0xa0, 0x2c, 0x33, + 0x02, 0xa0, 0x4c, 0x33, 0x02, 0xa0, 0x44, 0x36, 0x02, 0xa0, 0x40, 0x32, 0x02, 0xa0, 0x44, 0x36, - 0x04, 0x47, 0xf3, 0x68, - 0x40, 0x16, 0x1e, 0x69, - 0xff, 0x2d, 0x23, 0x61, - 0xff, 0x29, 0x8d, 0x75, + 0x04, 0x47, 0x03, 0x69, + 0x40, 0x16, 0x2e, 0x69, + 0xff, 0x2d, 0x33, 0x61, + 0xff, 0x29, 0x65, 0x70, 0x01, 0x37, 0xc1, 0x31, 0x02, 0x28, 0x55, 0x32, 0x01, 0xea, 0x5a, 0x01, @@ -140,26 +148,22 @@ static uint8_t seqprog[] = { 0x01, 0x50, 0xa1, 0x1a, 0xff, 0x4e, 0x9d, 0x1a, 0xff, 0x4f, 0x9f, 0x22, - 0xff, 0x8d, 0x17, 0x71, - 0x80, 0xac, 0x16, 0x71, - 0x20, 0x16, 0x16, 0x69, + 0xff, 0x8d, 0x27, 0x71, + 0x80, 0xac, 0x26, 0x71, + 0x20, 0x16, 0x26, 0x69, 0x02, 0x8c, 0x51, 0x31, - 0x00, 0xe2, 0x00, 0x41, + 0x00, 0xe2, 0x10, 0x41, 0x01, 0xac, 0x08, 0x31, 0x09, 0xea, 0x5a, 0x01, 0x02, 0x8c, 0x51, 0x32, 0xff, 0xea, 0x1a, 0x07, 0x04, 0x24, 0xf9, 0x30, - 0x1d, 0xea, 0x2e, 0x41, + 0x1d, 0xea, 0x38, 0x41, 0x02, 0x2c, 0x51, 0x31, - 0x04, 0xac, 0xf9, 0x30, - 0x19, 0xea, 0x2e, 0x59, - 0x02, 0x8c, 0x59, 0x32, - 0x02, 0x28, 0x19, 0x33, - 0x02, 0xa8, 0x50, 0x36, + 0x04, 0xa0, 0xf9, 0x30, + 0x19, 0xea, 0x38, 0x41, 0x06, 0xea, 0x08, 0x81, 0x01, 0xe2, 0x5a, 0x35, - 0x02, 0xa8, 0xf4, 0x31, 0x02, 0xf2, 0xf0, 0x35, 0x02, 0xf2, 0xf0, 0x31, 0x02, 0xf8, 0xe4, 0x35, @@ -175,23 +179,23 @@ static uint8_t seqprog[] = { 0x02, 0x20, 0xb9, 0x30, 0x02, 0x20, 0x51, 0x31, 0x4c, 0xa9, 0xd7, 0x28, - 0x10, 0xa8, 0x59, 0x79, + 0x10, 0xa8, 0x61, 0x79, 0x01, 0x6b, 0xc0, 0x30, 0x02, 0x64, 0xc8, 0x00, 0x40, 0x3a, 0x74, 0x04, - 0x00, 0xe2, 0x66, 0x58, - 0x33, 0xea, 0x3a, 0x59, + 0x00, 0xe2, 0x56, 0x58, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x30, 0x3f, 0xc0, 0x09, - 0x30, 0xe0, 0x5a, 0x61, - 0x20, 0x3f, 0x70, 0x69, - 0x10, 0x3f, 0x5a, 0x79, + 0x30, 0xe0, 0x62, 0x61, + 0x20, 0x3f, 0x78, 0x69, + 0x10, 0x3f, 0x62, 0x79, 0x02, 0xea, 0x7e, 0x00, - 0x00, 0xea, 0x3a, 0x59, + 0x00, 0xea, 0x42, 0x59, 0x01, 0xea, 0x00, 0x30, 0x02, 0x48, 0x51, 0x35, 0x01, 0xea, 0x7e, 0x00, - 0x11, 0xea, 0x3a, 0x59, + 0x11, 0xea, 0x42, 0x59, 0x11, 0xea, 0x00, 0x00, 0x02, 0x48, 0x51, 0x35, 0x08, 0xea, 0x98, 0x00, @@ -201,11 +205,11 @@ static uint8_t seqprog[] = { 0x0f, 0x67, 0xc0, 0x09, 0x00, 0x34, 0x69, 0x02, 0x20, 0xea, 0x96, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x40, 0x3a, 0xa4, 0x69, + 0x00, 0xe2, 0xf6, 0x41, + 0x40, 0x3a, 0xac, 0x69, 0x02, 0x55, 0x06, 0x68, - 0x02, 0x56, 0xa4, 0x69, - 0xff, 0x5b, 0xa4, 0x61, + 0x02, 0x56, 0xac, 0x69, + 0xff, 0x5b, 0xac, 0x61, 0x02, 0x20, 0x51, 0x31, 0x80, 0xea, 0xb2, 0x01, 0x44, 0xea, 0x00, 0x00, @@ -213,36 +217,36 @@ static uint8_t seqprog[] = { 0x33, 0xea, 0x00, 0x00, 0xff, 0xea, 0xb2, 0x09, 0xff, 0xe0, 0xc0, 0x19, - 0xff, 0xe0, 0xa6, 0x79, - 0x02, 0x94, 0x51, 0x31, - 0x00, 0xe2, 0x9c, 0x41, + 0xff, 0xe0, 0xae, 0x79, + 0x02, 0xa4, 0x51, 0x31, + 0x00, 0xe2, 0xa4, 0x41, 0x02, 0x5e, 0x50, 0x31, 0x02, 0xa8, 0xb8, 0x30, 0x02, 0x5c, 0x50, 0x31, - 0xff, 0x95, 0xb7, 0x71, - 0x02, 0x94, 0x41, 0x31, + 0xff, 0xa5, 0xbf, 0x71, + 0x02, 0xa4, 0x41, 0x31, 0x02, 0x22, 0x51, 0x31, - 0x02, 0xa0, 0x2c, 0x33, + 0x02, 0xa0, 0x4c, 0x33, 0x02, 0xa0, 0x44, 0x32, - 0x00, 0xe2, 0xc0, 0x41, - 0x10, 0xa8, 0xc1, 0x69, + 0x00, 0xe2, 0xc8, 0x41, + 0x10, 0xa8, 0xc9, 0x69, 0x3d, 0xa9, 0xc9, 0x29, 0x01, 0xe4, 0xc8, 0x01, 0x01, 0xea, 0xca, 0x01, 0xff, 0xea, 0xda, 0x01, 0x02, 0x20, 0x51, 0x31, - 0x02, 0x96, 0x41, 0x32, - 0xff, 0x21, 0xc9, 0x61, + 0x02, 0xa6, 0x41, 0x32, + 0xff, 0x21, 0xd1, 0x61, 0xff, 0xea, 0x46, 0x02, 0x02, 0x5c, 0x50, 0x31, 0x40, 0xea, 0x96, 0x00, - 0x02, 0x56, 0xde, 0x6d, - 0x01, 0x55, 0xde, 0x6d, - 0x10, 0xa8, 0xd5, 0x79, - 0x10, 0x40, 0xde, 0x69, - 0x01, 0x56, 0xde, 0x79, - 0xff, 0x93, 0x07, 0x78, - 0x13, 0xea, 0x46, 0x59, + 0x02, 0x56, 0xda, 0x6d, + 0x01, 0x55, 0xda, 0x6d, + 0x10, 0xa8, 0xdd, 0x79, + 0x10, 0x40, 0xe6, 0x69, + 0x01, 0x56, 0xe6, 0x79, + 0xff, 0xad, 0x07, 0x78, + 0x13, 0xea, 0x4e, 0x59, 0x13, 0xea, 0x04, 0x00, 0x00, 0xe2, 0x06, 0x40, 0xbf, 0x3a, 0x74, 0x08, @@ -253,104 +257,104 @@ static uint8_t seqprog[] = { 0x40, 0xea, 0x66, 0x02, 0x08, 0x3c, 0x78, 0x00, 0x80, 0xea, 0x62, 0x02, - 0x00, 0xe2, 0xa2, 0x5b, + 0x00, 0xe2, 0xb2, 0x5b, 0x01, 0x36, 0xc1, 0x31, - 0x9f, 0xe0, 0x44, 0x7c, - 0x80, 0xe0, 0x02, 0x72, - 0xa0, 0xe0, 0x3a, 0x72, - 0xc0, 0xe0, 0x30, 0x72, - 0xe0, 0xe0, 0x6a, 0x72, - 0x01, 0xea, 0x46, 0x59, + 0x9f, 0xe0, 0x54, 0x7c, + 0x80, 0xe0, 0x0a, 0x72, + 0xa0, 0xe0, 0x42, 0x72, + 0xc0, 0xe0, 0x38, 0x72, + 0xe0, 0xe0, 0x72, 0x72, + 0x01, 0xea, 0x4e, 0x59, 0x01, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x80, 0x33, 0x09, 0x7a, - 0x03, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xf6, 0x41, + 0x80, 0x33, 0x11, 0x7a, + 0x03, 0xea, 0x4e, 0x59, 0x03, 0xea, 0x04, 0x00, - 0xee, 0x00, 0x10, 0x6a, + 0xee, 0x00, 0x18, 0x6a, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x02, 0xa8, 0x90, 0x32, - 0x00, 0xe2, 0x60, 0x59, - 0xef, 0x92, 0xd5, 0x19, - 0x00, 0xe2, 0x20, 0x52, + 0x00, 0xe2, 0x68, 0x59, + 0xef, 0xac, 0xd5, 0x19, + 0x00, 0xe2, 0x28, 0x52, 0x09, 0x80, 0xe1, 0x30, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0x26, 0x42, - 0x01, 0x92, 0xd1, 0x30, + 0x00, 0xe2, 0x2e, 0x42, + 0x01, 0xac, 0xd1, 0x30, 0x10, 0x80, 0x89, 0x31, 0x20, 0xea, 0x32, 0x00, 0xbf, 0x33, 0x67, 0x0a, - 0x20, 0x19, 0x28, 0x6a, - 0x02, 0x4d, 0xee, 0x69, + 0x20, 0x19, 0x30, 0x6a, + 0x02, 0x4d, 0xf6, 0x69, 0x40, 0x33, 0x67, 0x02, - 0x00, 0xe2, 0xee, 0x41, - 0x80, 0x33, 0xa7, 0x6a, + 0x00, 0xe2, 0xf6, 0x41, + 0x80, 0x33, 0xaf, 0x6a, 0x01, 0x44, 0x10, 0x33, 0x08, 0xa8, 0x51, 0x03, - 0x00, 0xe2, 0xee, 0x41, + 0x00, 0xe2, 0xf6, 0x41, 0x10, 0xea, 0x80, 0x00, 0x01, 0x31, 0xc5, 0x31, - 0x80, 0xe2, 0x56, 0x62, - 0x10, 0xa8, 0x7b, 0x6a, + 0x80, 0xe2, 0x5e, 0x62, + 0x10, 0xa8, 0x83, 0x6a, 0xc0, 0xaa, 0xc5, 0x01, - 0x40, 0xa8, 0x47, 0x6a, + 0x40, 0xa8, 0x4f, 0x6a, 0xbf, 0xe2, 0xc4, 0x09, - 0x20, 0xa8, 0x5b, 0x7a, + 0x20, 0xa8, 0x63, 0x7a, 0x01, 0xe2, 0x88, 0x30, - 0x00, 0xe2, 0xa2, 0x5b, - 0xa0, 0x36, 0x63, 0x62, + 0x00, 0xe2, 0xb2, 0x5b, + 0xa0, 0x36, 0x6b, 0x62, 0x23, 0xa8, 0x89, 0x08, - 0x00, 0xe2, 0xa2, 0x5b, - 0xa0, 0x36, 0x63, 0x62, - 0x00, 0xa8, 0x5a, 0x42, - 0xff, 0xe2, 0x5a, 0x62, - 0x00, 0xe2, 0x7a, 0x42, + 0x00, 0xe2, 0xb2, 0x5b, + 0xa0, 0x36, 0x6b, 0x62, + 0x00, 0xa8, 0x62, 0x42, + 0xff, 0xe2, 0x62, 0x62, + 0x00, 0xe2, 0x82, 0x42, 0x40, 0xea, 0x98, 0x00, 0x01, 0xe2, 0x88, 0x30, - 0x00, 0xe2, 0xa2, 0x5b, - 0xa0, 0x36, 0x39, 0x72, + 0x00, 0xe2, 0xb2, 0x5b, + 0xa0, 0x36, 0x41, 0x72, 0x40, 0xea, 0x98, 0x00, 0x01, 0x31, 0x89, 0x32, 0x08, 0xea, 0x62, 0x02, - 0x00, 0xe2, 0xee, 0x41, - 0xe0, 0xea, 0xbe, 0x5b, - 0x80, 0xe0, 0xb2, 0x6a, - 0x04, 0xe0, 0x50, 0x73, - 0x02, 0xe0, 0x80, 0x73, - 0x00, 0xea, 0x10, 0x73, - 0x03, 0xe0, 0x90, 0x73, - 0x23, 0xe0, 0x8c, 0x72, - 0x08, 0xe0, 0xae, 0x72, - 0x00, 0xe2, 0xa2, 0x5b, - 0x07, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xf6, 0x41, + 0xe0, 0xea, 0xce, 0x5b, + 0x80, 0xe0, 0xba, 0x6a, + 0x04, 0xe0, 0x60, 0x73, + 0x02, 0xe0, 0x90, 0x73, + 0x00, 0xea, 0x18, 0x73, + 0x03, 0xe0, 0xa0, 0x73, + 0x23, 0xe0, 0x94, 0x72, + 0x08, 0xe0, 0xb6, 0x72, + 0x00, 0xe2, 0xb2, 0x5b, + 0x07, 0xea, 0x4e, 0x59, 0x07, 0xea, 0x04, 0x00, - 0x08, 0x42, 0xef, 0x71, - 0x04, 0x42, 0x89, 0x62, + 0x08, 0x42, 0xf7, 0x71, + 0x04, 0x42, 0x91, 0x62, 0x01, 0x43, 0x89, 0x30, - 0x00, 0xe2, 0x7a, 0x42, + 0x00, 0xe2, 0x82, 0x42, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0x7a, 0x42, + 0x00, 0xe2, 0x82, 0x42, 0x01, 0x00, 0x60, 0x32, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x4c, 0x34, 0xc1, 0x28, 0x01, 0x64, 0xc0, 0x31, - 0x00, 0x30, 0x3b, 0x59, + 0x00, 0x30, 0x43, 0x59, 0x01, 0x30, 0x01, 0x30, - 0x01, 0xe0, 0xac, 0x7a, - 0xa0, 0xea, 0xb4, 0x5b, - 0x01, 0xa0, 0xac, 0x62, - 0x01, 0x84, 0xa5, 0x7a, - 0x01, 0xa7, 0xae, 0x7a, - 0x00, 0xe2, 0xae, 0x42, - 0x03, 0xea, 0x46, 0x59, + 0x01, 0xe0, 0xb4, 0x7a, + 0xa0, 0xea, 0xc4, 0x5b, + 0x01, 0xa0, 0xb4, 0x62, + 0x01, 0x84, 0xad, 0x7a, + 0x01, 0xa7, 0xb6, 0x7a, + 0x00, 0xe2, 0xb6, 0x42, + 0x03, 0xea, 0x4e, 0x59, 0x03, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xae, 0x42, - 0x07, 0xea, 0xc6, 0x5b, + 0x00, 0xe2, 0xb6, 0x42, + 0x07, 0xea, 0xd6, 0x5b, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0xee, 0x41, + 0x00, 0xe2, 0xf6, 0x41, 0x3f, 0xe0, 0x6a, 0x0a, 0xc0, 0x34, 0xc1, 0x09, 0x00, 0x35, 0x51, 0x01, @@ -361,78 +365,82 @@ static uint8_t seqprog[] = { 0x01, 0xea, 0xc6, 0x01, 0x02, 0xe2, 0xc8, 0x31, 0x02, 0xec, 0x40, 0x31, - 0xff, 0xa1, 0xce, 0x72, + 0xff, 0xa1, 0xd6, 0x72, 0x02, 0xe8, 0xda, 0x31, 0x02, 0xa0, 0x50, 0x31, - 0x00, 0xe2, 0xf0, 0x42, + 0x00, 0xe2, 0xf8, 0x42, 0x80, 0x33, 0x67, 0x02, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0xa2, 0x5b, + 0x00, 0xe2, 0xb2, 0x5b, 0x01, 0x33, 0x67, 0x02, - 0xe0, 0x36, 0x0b, 0x63, + 0xe0, 0x36, 0x13, 0x63, 0x02, 0x33, 0x67, 0x02, - 0x20, 0x46, 0x04, 0x63, + 0x20, 0x46, 0x0c, 0x63, 0xff, 0xea, 0x52, 0x09, - 0xa8, 0xea, 0xb4, 0x5b, - 0x04, 0xa8, 0xeb, 0x7a, + 0xa8, 0xea, 0xc4, 0x5b, + 0x04, 0xa8, 0xf3, 0x7a, 0x01, 0x34, 0xc1, 0x31, - 0x00, 0xa9, 0xeb, 0x62, + 0x00, 0xa9, 0xf3, 0x62, 0x01, 0x35, 0xc1, 0x31, - 0x00, 0xaa, 0xf5, 0x72, + 0x00, 0xaa, 0xfd, 0x72, 0x01, 0xa9, 0x52, 0x11, - 0xff, 0xa9, 0xe0, 0x6a, - 0x00, 0xe2, 0x04, 0x43, + 0xff, 0xa9, 0xe8, 0x6a, + 0x00, 0xe2, 0x0c, 0x43, 0x10, 0x33, 0x67, 0x02, - 0x04, 0xa8, 0x05, 0x7b, + 0x04, 0xa8, 0x0d, 0x7b, 0xfb, 0xa8, 0x51, 0x0b, 0xff, 0xea, 0x66, 0x0a, - 0x01, 0xa4, 0xff, 0x6a, + 0x01, 0x9c, 0x07, 0x6b, 0x02, 0xa8, 0x90, 0x32, - 0x00, 0xe2, 0x60, 0x59, - 0x10, 0xa8, 0xaf, 0x7a, - 0xff, 0xea, 0xc6, 0x5b, - 0x00, 0xe2, 0xae, 0x42, - 0x04, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0x68, 0x59, + 0x10, 0xa8, 0xb7, 0x7a, + 0xff, 0xea, 0xd6, 0x5b, + 0x00, 0xe2, 0xb6, 0x42, + 0x04, 0xea, 0x4e, 0x59, 0x04, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xae, 0x42, - 0x04, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xb6, 0x42, + 0x04, 0xea, 0x4e, 0x59, 0x04, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x08, 0xa8, 0xa7, 0x7a, - 0xc0, 0x33, 0x1b, 0x7b, - 0x80, 0x33, 0xa7, 0x6a, - 0xff, 0x88, 0x1b, 0x6b, - 0x40, 0x33, 0xa7, 0x6a, - 0x10, 0xa8, 0x21, 0x7b, - 0x0a, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xf6, 0x41, + 0x08, 0xa8, 0xaf, 0x7a, + 0xc0, 0x33, 0x23, 0x7b, + 0x80, 0x33, 0xaf, 0x6a, + 0xff, 0x88, 0x23, 0x6b, + 0x40, 0x33, 0xaf, 0x6a, + 0x10, 0xa8, 0x29, 0x7b, + 0x0a, 0xea, 0x4e, 0x59, 0x0a, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x3a, 0x5b, - 0x00, 0xe2, 0x6c, 0x43, - 0x50, 0x4b, 0x28, 0x6b, + 0x00, 0xe2, 0x48, 0x5b, + 0x00, 0xe2, 0x7c, 0x43, + 0x50, 0x4b, 0x30, 0x6b, 0xbf, 0x3a, 0x74, 0x08, - 0x01, 0xe0, 0xf8, 0x31, + 0x01, 0xe0, 0xf4, 0x31, 0xff, 0xea, 0xc0, 0x09, 0x01, 0x2e, 0x5d, 0x1a, 0x00, 0x2f, 0x5f, 0x22, 0x04, 0x47, 0x8f, 0x02, - 0x01, 0xfc, 0xc0, 0x35, - 0x33, 0xea, 0x3a, 0x59, + 0x01, 0xfa, 0xc0, 0x35, + 0x02, 0xa8, 0x84, 0x32, + 0x02, 0xea, 0xb4, 0x00, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x02, 0x42, 0x51, 0x31, - 0xff, 0x88, 0x47, 0x6b, - 0x01, 0xa4, 0x43, 0x6b, - 0x02, 0xa4, 0x4b, 0x6b, - 0x01, 0x84, 0x4b, 0x7b, + 0xff, 0xae, 0x65, 0x68, + 0xff, 0x88, 0x55, 0x6b, + 0x01, 0x9c, 0x51, 0x6b, + 0x02, 0x9c, 0x59, 0x6b, + 0x01, 0x84, 0x59, 0x7b, 0x02, 0x28, 0x19, 0x33, 0x02, 0xa8, 0x50, 0x36, - 0xff, 0x88, 0x4b, 0x73, - 0x00, 0xe2, 0x24, 0x5b, + 0xff, 0x88, 0x59, 0x73, + 0x00, 0xe2, 0x2c, 0x5b, + 0x02, 0xa8, 0x5c, 0x33, 0x02, 0x2c, 0x19, 0x33, 0x02, 0xa8, 0x58, 0x32, - 0x04, 0xa4, 0x49, 0x07, - 0xc0, 0x33, 0xa7, 0x6a, + 0x04, 0x9c, 0x39, 0x07, + 0xc0, 0x33, 0xaf, 0x6a, 0x04, 0xa8, 0x51, 0x03, - 0x20, 0xa8, 0x6d, 0x6b, + 0x20, 0xa8, 0x7d, 0x6b, 0x02, 0xa8, 0x40, 0x31, 0xc0, 0x34, 0xc1, 0x09, 0x00, 0x35, 0x51, 0x01, @@ -447,73 +455,73 @@ static uint8_t seqprog[] = { 0xf7, 0x57, 0xae, 0x08, 0x08, 0xea, 0x98, 0x00, 0x01, 0x44, 0xd4, 0x31, - 0xee, 0x00, 0x76, 0x6b, + 0xee, 0x00, 0x86, 0x6b, 0x02, 0xea, 0xb4, 0x00, - 0x00, 0xe2, 0x9e, 0x5b, - 0x09, 0x4c, 0x78, 0x7b, + 0x00, 0xe2, 0xae, 0x5b, + 0x09, 0x4c, 0x88, 0x7b, 0x08, 0x4c, 0x06, 0x68, - 0x0b, 0xea, 0x46, 0x59, + 0x0b, 0xea, 0x4e, 0x59, 0x0b, 0xea, 0x04, 0x00, 0x01, 0x44, 0xd4, 0x31, - 0x20, 0x33, 0xef, 0x79, - 0x00, 0xe2, 0x88, 0x5b, - 0x00, 0xe2, 0xee, 0x41, - 0x01, 0x84, 0x8d, 0x7b, - 0x01, 0xa4, 0x49, 0x07, - 0x08, 0x60, 0x30, 0x33, - 0x08, 0x80, 0x41, 0x37, + 0x20, 0x33, 0xf7, 0x79, + 0x00, 0xe2, 0x98, 0x5b, + 0x00, 0xe2, 0xf6, 0x41, + 0x01, 0x84, 0x9d, 0x7b, + 0x01, 0x9c, 0x39, 0x07, + 0x08, 0x60, 0x20, 0x33, + 0x08, 0x80, 0x31, 0x37, 0xdf, 0x33, 0x67, 0x0a, - 0xee, 0x00, 0x9a, 0x6b, + 0xee, 0x00, 0xaa, 0x6b, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x00, 0xe2, 0x60, 0x59, - 0x00, 0xe2, 0xae, 0x42, + 0x00, 0xe2, 0x68, 0x59, + 0x00, 0xe2, 0xb6, 0x42, 0x01, 0xea, 0x6c, 0x02, 0xc0, 0xea, 0x66, 0x06, - 0xff, 0x42, 0xae, 0x6b, - 0x01, 0x41, 0xa2, 0x6b, - 0x02, 0x41, 0xa2, 0x7b, - 0xff, 0x42, 0xae, 0x6b, - 0x01, 0x41, 0xa2, 0x6b, - 0x02, 0x41, 0xa2, 0x7b, - 0xff, 0x42, 0xae, 0x7b, - 0x04, 0x4c, 0xa2, 0x6b, + 0xff, 0x42, 0xbe, 0x6b, + 0x01, 0x41, 0xb2, 0x6b, + 0x02, 0x41, 0xb2, 0x7b, + 0xff, 0x42, 0xbe, 0x6b, + 0x01, 0x41, 0xb2, 0x6b, + 0x02, 0x41, 0xb2, 0x7b, + 0xff, 0x42, 0xbe, 0x7b, + 0x04, 0x4c, 0xb2, 0x6b, 0xe0, 0x41, 0x6c, 0x0e, 0x01, 0x44, 0xd4, 0x31, - 0xff, 0x42, 0xb6, 0x7b, - 0x04, 0x4c, 0xb6, 0x6b, + 0xff, 0x42, 0xc6, 0x7b, + 0x04, 0x4c, 0xc6, 0x6b, 0xe0, 0x41, 0x6c, 0x0a, - 0xe0, 0x36, 0xef, 0x61, + 0xe0, 0x36, 0xf7, 0x61, 0xff, 0xea, 0xca, 0x09, 0x01, 0xe2, 0xc8, 0x31, 0x01, 0x46, 0xda, 0x35, 0x01, 0x44, 0xd4, 0x35, 0x10, 0xea, 0x80, 0x00, 0x01, 0xe2, 0x62, 0x36, - 0x04, 0xa6, 0xce, 0x7b, + 0x04, 0xa6, 0xde, 0x7b, 0xff, 0xea, 0x5a, 0x09, 0xff, 0xea, 0x4c, 0x0d, - 0x01, 0xa6, 0xec, 0x6b, - 0x10, 0xad, 0x8c, 0x7d, - 0x80, 0xad, 0xe4, 0x6b, - 0x08, 0xad, 0x8c, 0x6d, + 0x01, 0xa6, 0xfc, 0x6b, + 0x10, 0xad, 0x64, 0x78, + 0x80, 0xad, 0xf4, 0x6b, + 0x08, 0xad, 0x64, 0x68, 0x04, 0x84, 0xf9, 0x30, 0x00, 0xea, 0x08, 0x81, 0xff, 0xea, 0xd4, 0x09, 0x02, 0x84, 0xf9, 0x88, 0x0d, 0xea, 0x5a, 0x01, 0x04, 0xa6, 0x4c, 0x05, - 0x04, 0xa6, 0x8c, 0x7d, + 0x04, 0xa6, 0x64, 0x78, 0xff, 0xea, 0x5a, 0x09, 0x03, 0x84, 0x59, 0x89, 0x03, 0xea, 0x4c, 0x01, - 0x80, 0x1a, 0x8c, 0x7d, - 0x08, 0x19, 0x8c, 0x7d, + 0x80, 0x1a, 0x64, 0x78, + 0x08, 0x19, 0x64, 0x78, 0x08, 0xb0, 0xe0, 0x30, 0x04, 0xb0, 0xe0, 0x30, 0x03, 0xb0, 0xf0, 0x30, - 0x01, 0x78, 0xfa, 0x7b, + 0x01, 0x78, 0x0a, 0x7c, 0x01, 0xa7, 0x4e, 0x11, 0x01, 0xb0, 0x06, 0x33, 0x7f, 0x83, 0xe9, 0x08, @@ -524,275 +532,268 @@ static uint8_t seqprog[] = { 0x00, 0x86, 0x0d, 0x23, 0x00, 0x87, 0x0f, 0x23, 0x01, 0x84, 0xc5, 0x31, - 0x01, 0xa7, 0x10, 0x7c, + 0x01, 0xa7, 0x20, 0x7c, 0x04, 0xe2, 0xc4, 0x01, - 0x80, 0x83, 0x17, 0x7c, + 0x80, 0x83, 0x27, 0x7c, 0x02, 0xe2, 0xc4, 0x01, 0xff, 0xea, 0x4c, 0x09, 0x01, 0xe2, 0x36, 0x30, 0xc8, 0x19, 0x32, 0x00, 0x88, 0x19, 0x32, 0x00, 0x01, 0xac, 0xd4, 0x99, - 0x00, 0xe2, 0x8c, 0x55, + 0x00, 0xe2, 0x64, 0x50, 0xfe, 0xa6, 0x4c, 0x0d, - 0x0b, 0x98, 0xe1, 0x30, - 0x01, 0xa0, 0x4f, 0x09, - 0xfd, 0xa4, 0x49, 0x09, - 0x80, 0xa3, 0x2d, 0x7c, + 0x0b, 0x90, 0xe1, 0x30, + 0x01, 0x98, 0x4f, 0x09, + 0xfd, 0x9c, 0x49, 0x09, + 0x80, 0x9b, 0x3d, 0x7c, 0x02, 0xa4, 0x48, 0x01, - 0x01, 0xa7, 0x30, 0x7c, + 0x01, 0xa7, 0x40, 0x7c, 0x04, 0xa4, 0x48, 0x01, 0x01, 0xa4, 0x36, 0x30, 0xa8, 0xea, 0x32, 0x00, - 0xfd, 0xa4, 0x49, 0x0b, - 0x05, 0xa3, 0x07, 0x33, - 0x80, 0x83, 0x3d, 0x6c, + 0xfd, 0x9c, 0x39, 0x0b, + 0x05, 0x9b, 0x07, 0x33, + 0x80, 0x83, 0x4d, 0x6c, 0x02, 0xea, 0x4c, 0x05, 0xff, 0xea, 0x4c, 0x0d, - 0x00, 0xe2, 0x32, 0x59, - 0x02, 0xa6, 0xd0, 0x6b, + 0x00, 0xe2, 0x3c, 0x59, + 0x02, 0xa6, 0xe0, 0x6b, 0x80, 0xf9, 0xf2, 0x05, - 0xc0, 0x33, 0x4b, 0x7c, - 0x03, 0xea, 0x46, 0x59, + 0xc0, 0x33, 0x5b, 0x7c, + 0x03, 0xea, 0x4e, 0x59, 0x03, 0xea, 0x04, 0x00, - 0x20, 0x33, 0x6f, 0x7c, - 0x01, 0x84, 0x55, 0x6c, - 0x06, 0xea, 0x46, 0x59, + 0x20, 0x33, 0x7f, 0x7c, + 0x01, 0x84, 0x65, 0x6c, + 0x06, 0xea, 0x4e, 0x59, 0x06, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x72, 0x44, + 0x00, 0xe2, 0x82, 0x44, 0x01, 0x00, 0x60, 0x32, - 0xee, 0x00, 0x5e, 0x6c, + 0xee, 0x00, 0x6e, 0x6c, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x3a, 0x59, + 0x33, 0xea, 0x42, 0x59, 0x33, 0xea, 0x00, 0x00, 0x80, 0x3d, 0x7a, 0x00, - 0xfc, 0x42, 0x60, 0x7c, + 0xfc, 0x42, 0x70, 0x7c, 0x7f, 0x3d, 0x7a, 0x08, - 0x00, 0x30, 0x3b, 0x59, + 0x00, 0x30, 0x43, 0x59, 0x01, 0x30, 0x01, 0x30, - 0x09, 0xea, 0x46, 0x59, + 0x09, 0xea, 0x4e, 0x59, 0x09, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x01, 0xa4, 0x55, 0x6c, - 0x00, 0xe2, 0x22, 0x5c, + 0x00, 0xe2, 0xf6, 0x41, + 0x01, 0x9c, 0x65, 0x6c, + 0x00, 0xe2, 0x32, 0x5c, 0x20, 0x33, 0x67, 0x02, 0x01, 0x00, 0x60, 0x32, - 0x02, 0xa6, 0x7a, 0x7c, - 0x00, 0xe2, 0x3e, 0x5c, + 0x02, 0xa6, 0x8a, 0x7c, + 0x00, 0xe2, 0x4e, 0x5c, + 0x00, 0xe2, 0x56, 0x58, 0x00, 0xe2, 0x66, 0x58, - 0x00, 0xe2, 0x76, 0x58, - 0x00, 0xe2, 0x30, 0x58, - 0x00, 0x30, 0x3b, 0x59, + 0x00, 0xe2, 0x3a, 0x58, + 0x00, 0x30, 0x43, 0x59, 0x01, 0x30, 0x01, 0x30, - 0x20, 0x19, 0x7a, 0x6c, - 0x00, 0xe2, 0xaa, 0x5c, - 0x04, 0x19, 0x94, 0x6c, + 0x20, 0x19, 0x8a, 0x6c, + 0x00, 0xe2, 0xba, 0x5c, + 0x04, 0x19, 0xa4, 0x6c, 0x02, 0x19, 0x32, 0x00, - 0x01, 0x84, 0x95, 0x7c, - 0x01, 0x1b, 0x8e, 0x7c, - 0x01, 0x1a, 0x94, 0x6c, - 0x00, 0xe2, 0x44, 0x44, - 0x80, 0x4b, 0x9a, 0x6c, - 0x01, 0x4c, 0x96, 0x7c, - 0x03, 0x42, 0x44, 0x6c, - 0x00, 0xe2, 0xca, 0x5b, + 0x01, 0x84, 0xa5, 0x7c, + 0x01, 0x1b, 0x9e, 0x7c, + 0x01, 0x1a, 0xa4, 0x6c, + 0x00, 0xe2, 0x54, 0x44, + 0x80, 0x4b, 0xaa, 0x6c, + 0x01, 0x4c, 0xa6, 0x7c, + 0x03, 0x42, 0x54, 0x6c, + 0x00, 0xe2, 0xda, 0x5b, 0x80, 0xf9, 0xf2, 0x01, - 0x04, 0x33, 0xef, 0x79, - 0x00, 0xe2, 0xee, 0x41, - 0x08, 0x5d, 0xb2, 0x6c, - 0x00, 0xe2, 0x66, 0x58, - 0x00, 0x30, 0x3b, 0x59, + 0x04, 0x33, 0xf7, 0x79, + 0x00, 0xe2, 0xf6, 0x41, + 0x08, 0x5d, 0xc2, 0x6c, + 0x00, 0xe2, 0x56, 0x58, + 0x00, 0x30, 0x43, 0x59, 0x01, 0x30, 0x01, 0x30, - 0x02, 0x1b, 0xa2, 0x7c, - 0x08, 0x5d, 0xb0, 0x7c, + 0x02, 0x1b, 0xb2, 0x7c, + 0x08, 0x5d, 0xc0, 0x7c, 0x03, 0x68, 0x00, 0x37, 0x01, 0x84, 0x09, 0x07, - 0x80, 0x1b, 0xbc, 0x7c, - 0x80, 0x84, 0xbd, 0x6c, + 0x80, 0x1b, 0xcc, 0x7c, + 0x80, 0x84, 0xcd, 0x6c, 0xff, 0x85, 0x0b, 0x1b, 0xff, 0x86, 0x0d, 0x23, 0xff, 0x87, 0x0f, 0x23, 0xf8, 0x1b, 0x08, 0x0b, 0xff, 0xea, 0x4e, 0x09, - 0x04, 0x1b, 0xc4, 0x7c, + 0x04, 0x1b, 0xd4, 0x7c, 0x01, 0xa7, 0x4e, 0x01, 0xff, 0xea, 0x06, 0x0b, 0x03, 0x68, 0x00, 0x37, - 0x00, 0xe2, 0xb6, 0x58, + 0x00, 0xe2, 0xc4, 0x58, 0x10, 0xea, 0x18, 0x00, 0xf9, 0xd9, 0xb2, 0x0d, 0x01, 0xd9, 0xb2, 0x05, 0x01, 0x52, 0x48, 0x31, - 0x20, 0xa4, 0xe8, 0x7c, - 0x20, 0x5b, 0xe8, 0x7c, - 0x80, 0xf9, 0xf6, 0x7c, + 0x20, 0xa4, 0xfc, 0x7c, + 0x20, 0x5b, 0xfc, 0x7c, + 0x80, 0xf9, 0x0a, 0x7d, + 0x02, 0xea, 0xb4, 0x00, 0x11, 0x00, 0x00, 0x10, - 0x04, 0x19, 0xe2, 0x7c, + 0x04, 0x19, 0x16, 0x7d, 0xdf, 0x19, 0x32, 0x08, - 0x01, 0x4c, 0xde, 0x7c, + 0x60, 0x5b, 0xf4, 0x6c, + 0x01, 0x4c, 0xf0, 0x7c, 0x20, 0x19, 0x32, 0x00, - 0x11, 0x00, 0x00, 0x10, + 0x01, 0xd9, 0xb2, 0x05, 0x02, 0xea, 0xb4, 0x00, 0x01, 0xd9, 0xb2, 0x05, - 0x10, 0x5b, 0xfa, 0x6c, - 0x08, 0x5b, 0x02, 0x6d, - 0x20, 0x5b, 0xf4, 0x6c, - 0x02, 0x5b, 0x22, 0x6d, - 0x0e, 0xea, 0x46, 0x59, + 0x10, 0x5b, 0x0e, 0x6d, + 0x08, 0x5b, 0x18, 0x6d, + 0x20, 0x5b, 0x08, 0x6d, + 0x02, 0x5b, 0x38, 0x6d, + 0x0e, 0xea, 0x4e, 0x59, 0x0e, 0xea, 0x04, 0x00, - 0x80, 0xf9, 0xe4, 0x6c, + 0x80, 0xf9, 0xf8, 0x6c, 0xdf, 0x5c, 0xb8, 0x08, 0x01, 0xd9, 0xb2, 0x05, - 0x01, 0xa4, 0xf5, 0x6d, - 0x00, 0xe2, 0x22, 0x5c, - 0x00, 0xe2, 0x2c, 0x5d, + 0x01, 0x9c, 0xf3, 0x6d, + 0x00, 0xe2, 0x32, 0x5c, + 0x00, 0xe2, 0x42, 0x5d, + 0x01, 0xae, 0x5d, 0x1b, 0x01, 0xd9, 0xb2, 0x05, - 0x00, 0xe2, 0x24, 0x5b, - 0xf3, 0x92, 0xd5, 0x19, - 0x00, 0xe2, 0x10, 0x55, - 0x80, 0x92, 0x11, 0x6d, - 0x0f, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0x2c, 0x5b, + 0xf3, 0xac, 0xd5, 0x19, + 0x00, 0xe2, 0x26, 0x55, + 0x80, 0xac, 0x27, 0x6d, + 0x0f, 0xea, 0x4e, 0x59, 0x0f, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x18, 0x45, + 0x00, 0xe2, 0x2e, 0x45, 0x04, 0x8c, 0xe1, 0x30, 0x01, 0xea, 0xf2, 0x00, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0xff, 0x93, 0x1f, 0x7d, - 0x14, 0xea, 0x46, 0x59, + 0xff, 0xad, 0x35, 0x7d, + 0x14, 0xea, 0x4e, 0x59, 0x14, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xa6, 0x5d, + 0x00, 0xe2, 0xa4, 0x5d, 0x01, 0xd9, 0xb2, 0x05, 0x09, 0x80, 0xe1, 0x30, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0xce, 0x5d, + 0x00, 0xe2, 0x9c, 0x5d, 0x01, 0xd9, 0xb2, 0x05, - 0x02, 0xa8, 0xf4, 0x31, - 0x02, 0xa6, 0x3e, 0x7d, - 0x00, 0xe2, 0x34, 0x59, - 0x20, 0x5b, 0x4c, 0x6d, - 0xfc, 0x42, 0x38, 0x7d, - 0x10, 0x40, 0x3a, 0x6d, - 0x20, 0x4d, 0x3c, 0x7d, - 0x08, 0x5d, 0x4c, 0x6d, - 0x02, 0xa6, 0xd0, 0x6b, - 0x00, 0xe2, 0x34, 0x59, - 0x20, 0x5b, 0x4c, 0x6d, - 0x01, 0x1b, 0x6c, 0x6d, - 0xfc, 0x42, 0x48, 0x7d, - 0x10, 0x40, 0x4a, 0x6d, - 0x20, 0x4d, 0x8c, 0x7d, - 0x08, 0x5d, 0x8c, 0x7d, + 0x02, 0xa6, 0x52, 0x7d, + 0x00, 0xe2, 0x3c, 0x59, + 0x20, 0x5b, 0x60, 0x6d, + 0xfc, 0x42, 0x4c, 0x7d, + 0x10, 0x40, 0x4e, 0x6d, + 0x20, 0x4d, 0x50, 0x7d, + 0x08, 0x5d, 0x60, 0x6d, + 0x02, 0xa6, 0xe0, 0x6b, + 0x00, 0xe2, 0x3c, 0x59, + 0x20, 0x5b, 0x60, 0x6d, + 0x01, 0x1b, 0x80, 0x6d, + 0xfc, 0x42, 0x5c, 0x7d, + 0x10, 0x40, 0x5e, 0x6d, + 0x20, 0x4d, 0x64, 0x78, + 0x08, 0x5d, 0x64, 0x78, 0x02, 0x19, 0x32, 0x00, 0x01, 0x5b, 0x40, 0x31, - 0x00, 0xe2, 0xaa, 0x5c, - 0x00, 0xe2, 0x88, 0x5b, + 0x00, 0xe2, 0xba, 0x5c, + 0x00, 0xe2, 0x98, 0x5b, 0x20, 0xea, 0xb6, 0x00, - 0x00, 0xe2, 0xca, 0x5b, + 0x00, 0xe2, 0xda, 0x5b, 0x20, 0x5c, 0xb8, 0x00, - 0x04, 0x19, 0x62, 0x6d, - 0x01, 0x1a, 0x62, 0x6d, - 0x00, 0xe2, 0x34, 0x59, - 0x01, 0x1a, 0x8c, 0x7d, + 0x04, 0x19, 0x76, 0x6d, + 0x01, 0x1a, 0x76, 0x6d, + 0x00, 0xe2, 0x3c, 0x59, + 0x01, 0x1a, 0x64, 0x78, 0x80, 0xf9, 0xf2, 0x01, - 0x20, 0xa0, 0xde, 0x7d, - 0x08, 0xa8, 0x6b, 0x7d, - 0x00, 0xe2, 0x7e, 0x45, + 0x20, 0xa0, 0xda, 0x7d, + 0xff, 0xae, 0x5d, 0x1b, + 0x08, 0xa8, 0x3d, 0x6b, 0x02, 0xea, 0xb4, 0x04, - 0x02, 0x19, 0x32, 0x00, - 0x08, 0xa8, 0x8f, 0x7d, - 0x04, 0x5d, 0xf4, 0x7d, - 0x01, 0x1a, 0xf4, 0x7d, - 0x01, 0xa4, 0x49, 0x03, - 0x80, 0xf9, 0xf2, 0x01, - 0x02, 0xa8, 0x84, 0x32, - 0x02, 0xea, 0xb4, 0x00, - 0x00, 0xe2, 0x34, 0x43, - 0x02, 0xa8, 0x84, 0x32, - 0x02, 0xea, 0xb4, 0x00, - 0xff, 0xea, 0xd4, 0x19, - 0x00, 0xe2, 0x40, 0x59, - 0x11, 0x00, 0x00, 0x10, - 0x00, 0xe2, 0xc2, 0x5d, - 0x00, 0xe2, 0x34, 0x53, - 0xff, 0xea, 0xd4, 0x0d, - 0x00, 0xe2, 0x34, 0x59, - 0x40, 0x5b, 0x9a, 0x6d, + 0x01, 0x9c, 0x39, 0x03, + 0x40, 0x5b, 0x90, 0x6d, + 0x00, 0xe2, 0x3c, 0x59, + 0x40, 0x5b, 0x90, 0x6d, 0x04, 0x5d, 0xf4, 0x7d, 0x01, 0x1a, 0xf4, 0x7d, - 0x20, 0x4d, 0x8c, 0x7d, - 0x40, 0x5b, 0xde, 0x7d, + 0x20, 0x4d, 0x64, 0x78, + 0x40, 0x5b, 0xda, 0x7d, 0x04, 0x5d, 0xf4, 0x7d, 0x01, 0x1a, 0xf4, 0x7d, 0x80, 0xf9, 0xf2, 0x01, - 0x01, 0xa4, 0x49, 0x03, - 0x08, 0xa8, 0x7f, 0x6d, + 0xff, 0xae, 0x5d, 0x1b, + 0x08, 0xa8, 0x3d, 0x6b, 0x02, 0xea, 0xb4, 0x04, - 0x00, 0xe2, 0x32, 0x59, - 0x01, 0x1b, 0xb6, 0x7d, - 0x40, 0x5b, 0x8c, 0x7d, + 0x00, 0xe2, 0x3c, 0x59, + 0x01, 0x1b, 0x64, 0x78, + 0x80, 0xf9, 0xf2, 0x01, + 0x02, 0xea, 0xb4, 0x04, + 0x00, 0xe2, 0x3c, 0x59, + 0x01, 0x1b, 0xb8, 0x6d, + 0x40, 0x5b, 0xc6, 0x7d, + 0x01, 0x1b, 0xb8, 0x6d, 0x02, 0x19, 0x32, 0x00, + 0x01, 0x1a, 0x64, 0x78, 0x80, 0xf9, 0xf2, 0x01, 0xff, 0xea, 0x10, 0x03, 0x08, 0xa8, 0x51, 0x03, - 0x00, 0xe2, 0x7e, 0x45, - 0xff, 0x6a, 0xbc, 0x6d, - 0x40, 0x5b, 0x8c, 0x7d, - 0xff, 0x6a, 0xac, 0x7d, - 0x10, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0x3c, 0x43, + 0x01, 0x1a, 0xc2, 0x7d, + 0x40, 0x5b, 0xbe, 0x7d, + 0x01, 0x1a, 0xac, 0x6d, + 0xfc, 0x42, 0x64, 0x78, + 0x01, 0x1a, 0xc6, 0x6d, + 0x10, 0xea, 0x4e, 0x59, 0x10, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xac, 0x45, - 0x80, 0xf9, 0x8c, 0x6d, - 0x01, 0x43, 0xc1, 0x31, - 0x00, 0xfb, 0x8c, 0x65, - 0x01, 0x42, 0xc1, 0x31, - 0x00, 0xfa, 0x8c, 0x65, - 0x01, 0xe8, 0xd4, 0x1d, - 0x00, 0xe2, 0x32, 0x59, - 0x01, 0x1b, 0x8c, 0x7d, - 0x80, 0xf9, 0xf2, 0x01, - 0x02, 0xea, 0xb4, 0x04, + 0xfc, 0x42, 0x64, 0x78, + 0x10, 0x40, 0xcc, 0x6d, + 0x20, 0x4d, 0x64, 0x78, + 0x40, 0x5b, 0xac, 0x6d, + 0x01, 0x1a, 0x64, 0x78, + 0x01, 0xae, 0x5d, 0x1b, 0x30, 0x3f, 0xc0, 0x09, - 0x30, 0xe0, 0x8c, 0x65, - 0x40, 0x4b, 0x8c, 0x6d, + 0x30, 0xe0, 0x64, 0x60, + 0x40, 0x4b, 0x64, 0x68, 0xff, 0xea, 0x52, 0x01, - 0xee, 0x00, 0xe4, 0x6d, + 0xee, 0x00, 0xe0, 0x6d, 0x80, 0xf9, 0xf2, 0x01, + 0xff, 0xae, 0x5d, 0x1b, 0x02, 0xea, 0xb4, 0x00, 0x20, 0xea, 0x9a, 0x00, - 0xf3, 0x42, 0xee, 0x6d, - 0x12, 0xea, 0x46, 0x59, + 0xf3, 0x42, 0xec, 0x6d, + 0x12, 0xea, 0x4e, 0x59, 0x12, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x0d, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xf6, 0x41, + 0x0d, 0xea, 0x4e, 0x59, 0x0d, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xee, 0x41, - 0x11, 0xea, 0x46, 0x59, + 0x00, 0xe2, 0xf6, 0x41, + 0x01, 0xae, 0x5d, 0x1b, + 0x11, 0xea, 0x4e, 0x59, 0x11, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x24, 0x5b, + 0x00, 0xe2, 0x2c, 0x5b, 0x08, 0x5a, 0xb4, 0x00, - 0x00, 0xe2, 0x18, 0x5e, + 0x00, 0xe2, 0x1a, 0x5e, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0x34, 0x59, + 0x00, 0xe2, 0x3c, 0x59, 0x80, 0x1a, 0x08, 0x7e, - 0x00, 0xe2, 0x18, 0x5e, + 0x00, 0xe2, 0x1a, 0x5e, 0x80, 0x19, 0x32, 0x00, 0x40, 0x5b, 0x0e, 0x6e, 0x08, 0x5a, 0x0e, 0x7e, - 0x20, 0x4d, 0x8c, 0x7d, + 0x20, 0x4d, 0x64, 0x78, 0x02, 0x84, 0x09, 0x03, - 0x40, 0x5b, 0xde, 0x7d, - 0x08, 0xa8, 0x77, 0x6d, + 0x40, 0x5b, 0xda, 0x7d, + 0xff, 0xae, 0x5d, 0x1b, 0x80, 0xf9, 0xf2, 0x01, + 0x08, 0xa8, 0x3d, 0x6b, 0x02, 0xea, 0xb4, 0x04, 0x01, 0x38, 0xe1, 0x30, 0x05, 0x39, 0xe3, 0x98, - 0x01, 0xe0, 0xf8, 0x31, + 0x01, 0xe0, 0xf4, 0x31, 0xff, 0xea, 0xc0, 0x09, 0x00, 0x3a, 0xe5, 0x20, 0x00, 0x3b, 0xe7, 0x20, - 0x01, 0xfc, 0xc0, 0x31, + 0x01, 0xfa, 0xc0, 0x31, 0x04, 0xea, 0xe8, 0x30, 0xff, 0xea, 0xf0, 0x08, 0x02, 0xea, 0xf2, 0x00, @@ -800,12 +801,20 @@ static uint8_t seqprog[] = { }; typedef int ahd_patch_func_t (struct ahd_softc *ahd); +static ahd_patch_func_t ahd_patch21_func; + +static int +ahd_patch21_func(struct ahd_softc *ahd) +{ + return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0); +} + static ahd_patch_func_t ahd_patch20_func; static int ahd_patch20_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0); + return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0); } static ahd_patch_func_t ahd_patch19_func; @@ -813,7 +822,7 @@ static ahd_patch_func_t ahd_patch19_func; static int ahd_patch19_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0); + return ((ahd->features & AHD_RTI) == 0); } static ahd_patch_func_t ahd_patch18_func; @@ -821,7 +830,7 @@ static ahd_patch_func_t ahd_patch18_func; static int ahd_patch18_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_RTI) == 0); + return ((ahd->flags & AHD_INITIATORROLE) != 0); } static ahd_patch_func_t ahd_patch17_func; @@ -829,7 +838,7 @@ static ahd_patch_func_t ahd_patch17_func; static int ahd_patch17_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_INITIATORROLE) != 0); + return ((ahd->flags & AHD_TARGETROLE) != 0); } static ahd_patch_func_t ahd_patch16_func; @@ -837,7 +846,7 @@ static ahd_patch_func_t ahd_patch16_func; static int ahd_patch16_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_TARGETROLE) != 0); + return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0); } static ahd_patch_func_t ahd_patch15_func; @@ -845,7 +854,7 @@ static ahd_patch_func_t ahd_patch15_func; static int ahd_patch15_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0); + return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0); } static ahd_patch_func_t ahd_patch14_func; @@ -853,7 +862,7 @@ static ahd_patch_func_t ahd_patch14_func; static int ahd_patch14_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0); + return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0); } static ahd_patch_func_t ahd_patch13_func; @@ -861,7 +870,7 @@ static ahd_patch_func_t ahd_patch13_func; static int ahd_patch13_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0); + return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0); } static ahd_patch_func_t ahd_patch12_func; @@ -869,7 +878,7 @@ static ahd_patch_func_t ahd_patch12_func; static int ahd_patch12_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0); + return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0); } static ahd_patch_func_t ahd_patch11_func; @@ -877,7 +886,7 @@ static ahd_patch_func_t ahd_patch11_func; static int ahd_patch11_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0); + return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0); } static ahd_patch_func_t ahd_patch10_func; @@ -885,7 +894,7 @@ static ahd_patch_func_t ahd_patch10_func; static int ahd_patch10_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0); + return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0); } static ahd_patch_func_t ahd_patch9_func; @@ -893,7 +902,7 @@ static ahd_patch_func_t ahd_patch9_func; static int ahd_patch9_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0); + return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0); } static ahd_patch_func_t ahd_patch8_func; @@ -901,7 +910,7 @@ static ahd_patch_func_t ahd_patch8_func; static int ahd_patch8_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0); + return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0); } static ahd_patch_func_t ahd_patch7_func; @@ -909,7 +918,7 @@ static ahd_patch_func_t ahd_patch7_func; static int ahd_patch7_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0); + return ((ahd->bugs & AHD_LQO_ATNO_BUG) != 0); } static ahd_patch_func_t ahd_patch6_func; @@ -917,7 +926,7 @@ static ahd_patch_func_t ahd_patch6_func; static int ahd_patch6_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_LQO_ATNO_BUG) != 0); + return ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0); } static ahd_patch_func_t ahd_patch5_func; @@ -925,7 +934,7 @@ static ahd_patch_func_t ahd_patch5_func; static int ahd_patch5_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0); + return ((ahd->bugs & AHD_NONPACKFIFO_BUG) != 0); } static ahd_patch_func_t ahd_patch4_func; @@ -933,7 +942,7 @@ static ahd_patch_func_t ahd_patch4_func; static int ahd_patch4_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_NONPACKFIFO_BUG) != 0); + return ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0); } static ahd_patch_func_t ahd_patch3_func; @@ -941,7 +950,7 @@ static ahd_patch_func_t ahd_patch3_func; static int ahd_patch3_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0); + return ((ahd->bugs & AHD_FAINT_LED_BUG) != 0); } static ahd_patch_func_t ahd_patch2_func; @@ -982,128 +991,126 @@ static struct patch { { ahd_patch0_func, 5, 1, 1 }, { ahd_patch2_func, 6, 1, 2 }, { ahd_patch0_func, 7, 1, 1 }, - { ahd_patch2_func, 24, 1, 2 }, - { ahd_patch0_func, 25, 1, 1 }, - { ahd_patch1_func, 32, 1, 2 }, - { ahd_patch0_func, 33, 1, 1 }, - { ahd_patch2_func, 40, 1, 2 }, - { ahd_patch0_func, 41, 1, 1 }, - { ahd_patch2_func, 44, 1, 2 }, - { ahd_patch0_func, 45, 1, 1 }, - { ahd_patch2_func, 48, 1, 2 }, - { ahd_patch0_func, 49, 1, 1 }, + { ahd_patch3_func, 20, 5, 1 }, + { ahd_patch2_func, 29, 1, 2 }, + { ahd_patch0_func, 30, 1, 1 }, + { ahd_patch1_func, 37, 1, 2 }, + { ahd_patch0_func, 38, 1, 1 }, + { ahd_patch2_func, 43, 1, 2 }, + { ahd_patch0_func, 44, 1, 1 }, + { ahd_patch2_func, 47, 1, 2 }, + { ahd_patch0_func, 48, 1, 1 }, { ahd_patch2_func, 51, 1, 2 }, { ahd_patch0_func, 52, 1, 1 }, - { ahd_patch2_func, 55, 1, 2 }, - { ahd_patch0_func, 56, 1, 1 }, - { ahd_patch2_func, 59, 1, 2 }, - { ahd_patch0_func, 60, 1, 1 }, - { ahd_patch2_func, 157, 6, 1 }, - { ahd_patch1_func, 163, 2, 1 }, - { ahd_patch3_func, 165, 1, 1 }, - { ahd_patch2_func, 174, 1, 2 }, - { ahd_patch0_func, 175, 1, 1 }, - { ahd_patch4_func, 176, 2, 2 }, - { ahd_patch0_func, 178, 6, 3 }, - { ahd_patch2_func, 181, 1, 2 }, - { ahd_patch0_func, 182, 1, 1 }, + { ahd_patch2_func, 65, 1, 2 }, + { ahd_patch0_func, 66, 1, 1 }, + { ahd_patch2_func, 69, 1, 2 }, + { ahd_patch0_func, 70, 1, 1 }, + { ahd_patch1_func, 73, 1, 2 }, + { ahd_patch0_func, 74, 1, 1 }, + { ahd_patch2_func, 161, 6, 1 }, + { ahd_patch1_func, 167, 2, 1 }, + { ahd_patch4_func, 169, 1, 1 }, + { ahd_patch2_func, 178, 1, 2 }, + { ahd_patch0_func, 179, 1, 1 }, + { ahd_patch5_func, 180, 2, 2 }, + { ahd_patch0_func, 182, 6, 3 }, { ahd_patch2_func, 185, 1, 2 }, { ahd_patch0_func, 186, 1, 1 }, - { ahd_patch5_func, 188, 2, 1 }, - { ahd_patch3_func, 196, 16, 2 }, - { ahd_patch0_func, 212, 1, 1 }, - { ahd_patch6_func, 232, 2, 1 }, - { ahd_patch1_func, 236, 1, 2 }, - { ahd_patch0_func, 237, 1, 1 }, - { ahd_patch5_func, 240, 2, 1 }, - { ahd_patch1_func, 254, 1, 2 }, - { ahd_patch0_func, 255, 1, 1 }, + { ahd_patch2_func, 189, 1, 2 }, + { ahd_patch0_func, 190, 1, 1 }, + { ahd_patch6_func, 192, 2, 1 }, + { ahd_patch4_func, 200, 16, 2 }, + { ahd_patch0_func, 216, 1, 1 }, + { ahd_patch7_func, 236, 2, 1 }, + { ahd_patch1_func, 240, 1, 2 }, + { ahd_patch0_func, 241, 1, 1 }, + { ahd_patch6_func, 244, 2, 1 }, { ahd_patch1_func, 258, 1, 2 }, { ahd_patch0_func, 259, 1, 1 }, - { ahd_patch2_func, 262, 1, 2 }, + { ahd_patch1_func, 262, 1, 2 }, { ahd_patch0_func, 263, 1, 1 }, - { ahd_patch1_func, 318, 1, 2 }, - { ahd_patch0_func, 319, 1, 1 }, - { ahd_patch2_func, 327, 1, 2 }, - { ahd_patch0_func, 328, 1, 1 }, + { ahd_patch2_func, 266, 1, 2 }, + { ahd_patch0_func, 267, 1, 1 }, + { ahd_patch1_func, 322, 1, 2 }, + { ahd_patch0_func, 323, 1, 1 }, { ahd_patch2_func, 331, 1, 2 }, { ahd_patch0_func, 332, 1, 1 }, - { ahd_patch1_func, 339, 1, 2 }, - { ahd_patch0_func, 340, 1, 1 }, - { ahd_patch7_func, 359, 1, 1 }, - { ahd_patch7_func, 362, 1, 1 }, - { ahd_patch7_func, 364, 1, 1 }, - { ahd_patch7_func, 376, 1, 1 }, - { ahd_patch1_func, 386, 1, 2 }, - { ahd_patch0_func, 387, 1, 1 }, - { ahd_patch1_func, 389, 1, 2 }, - { ahd_patch0_func, 390, 1, 1 }, - { ahd_patch1_func, 398, 1, 2 }, - { ahd_patch0_func, 399, 1, 1 }, - { ahd_patch2_func, 410, 1, 2 }, - { ahd_patch0_func, 411, 1, 1 }, - { ahd_patch8_func, 439, 1, 1 }, - { ahd_patch1_func, 446, 1, 2 }, - { ahd_patch0_func, 447, 1, 1 }, - { ahd_patch2_func, 459, 1, 2 }, - { ahd_patch0_func, 460, 1, 1 }, - { ahd_patch9_func, 465, 6, 2 }, - { ahd_patch0_func, 471, 1, 1 }, - { ahd_patch10_func, 494, 1, 1 }, - { ahd_patch11_func, 503, 1, 1 }, - { ahd_patch12_func, 504, 1, 2 }, - { ahd_patch0_func, 505, 1, 1 }, - { ahd_patch13_func, 510, 1, 1 }, + { ahd_patch2_func, 335, 1, 2 }, + { ahd_patch0_func, 336, 1, 1 }, + { ahd_patch1_func, 343, 1, 2 }, + { ahd_patch0_func, 344, 1, 1 }, + { ahd_patch8_func, 363, 1, 1 }, + { ahd_patch8_func, 366, 1, 1 }, + { ahd_patch8_func, 368, 1, 1 }, + { ahd_patch8_func, 380, 1, 1 }, + { ahd_patch1_func, 390, 1, 2 }, + { ahd_patch0_func, 391, 1, 1 }, + { ahd_patch1_func, 393, 1, 2 }, + { ahd_patch0_func, 394, 1, 1 }, + { ahd_patch1_func, 402, 1, 2 }, + { ahd_patch0_func, 403, 1, 1 }, + { ahd_patch2_func, 416, 1, 2 }, + { ahd_patch0_func, 417, 1, 1 }, + { ahd_patch9_func, 447, 1, 1 }, + { ahd_patch1_func, 454, 1, 2 }, + { ahd_patch0_func, 455, 1, 1 }, + { ahd_patch2_func, 467, 1, 2 }, + { ahd_patch0_func, 468, 1, 1 }, + { ahd_patch10_func, 473, 6, 2 }, + { ahd_patch0_func, 479, 1, 1 }, + { ahd_patch11_func, 502, 1, 1 }, { ahd_patch12_func, 511, 1, 1 }, - { ahd_patch14_func, 524, 1, 2 }, - { ahd_patch0_func, 525, 1, 1 }, - { ahd_patch1_func, 547, 1, 2 }, - { ahd_patch0_func, 548, 1, 1 }, - { ahd_patch1_func, 551, 1, 2 }, - { ahd_patch0_func, 552, 1, 1 }, - { ahd_patch2_func, 557, 1, 2 }, - { ahd_patch0_func, 558, 1, 1 }, - { ahd_patch2_func, 562, 1, 2 }, - { ahd_patch0_func, 563, 1, 1 }, - { ahd_patch1_func, 564, 1, 2 }, - { ahd_patch0_func, 565, 1, 1 }, - { ahd_patch2_func, 576, 1, 2 }, - { ahd_patch0_func, 577, 1, 1 }, - { ahd_patch15_func, 581, 1, 1 }, - { ahd_patch16_func, 586, 1, 1 }, - { ahd_patch17_func, 587, 2, 1 }, - { ahd_patch16_func, 591, 1, 2 }, - { ahd_patch0_func, 592, 1, 1 }, - { ahd_patch2_func, 595, 1, 2 }, - { ahd_patch0_func, 596, 1, 1 }, - { ahd_patch2_func, 614, 1, 2 }, - { ahd_patch0_func, 615, 1, 1 }, - { ahd_patch18_func, 616, 12, 1 }, - { ahd_patch1_func, 632, 1, 2 }, - { ahd_patch0_func, 633, 1, 1 }, - { ahd_patch18_func, 634, 1, 1 }, - { ahd_patch1_func, 645, 1, 2 }, - { ahd_patch0_func, 646, 1, 1 }, - { ahd_patch1_func, 653, 1, 2 }, - { ahd_patch0_func, 654, 1, 1 }, - { ahd_patch15_func, 678, 1, 1 }, - { ahd_patch15_func, 694, 1, 1 }, - { ahd_patch2_func, 706, 1, 2 }, - { ahd_patch0_func, 707, 1, 1 }, - { ahd_patch15_func, 726, 1, 1 }, - { ahd_patch1_func, 734, 1, 2 }, - { ahd_patch0_func, 735, 1, 1 }, - { ahd_patch1_func, 756, 1, 2 }, - { ahd_patch0_func, 757, 1, 1 }, - { ahd_patch1_func, 759, 1, 2 }, - { ahd_patch0_func, 760, 1, 1 }, + { ahd_patch13_func, 512, 1, 2 }, + { ahd_patch0_func, 513, 1, 1 }, + { ahd_patch14_func, 518, 1, 1 }, + { ahd_patch13_func, 519, 1, 1 }, + { ahd_patch15_func, 532, 1, 2 }, + { ahd_patch0_func, 533, 1, 1 }, + { ahd_patch1_func, 555, 1, 2 }, + { ahd_patch0_func, 556, 1, 1 }, + { ahd_patch1_func, 559, 1, 2 }, + { ahd_patch0_func, 560, 1, 1 }, + { ahd_patch2_func, 565, 1, 2 }, + { ahd_patch0_func, 566, 1, 1 }, + { ahd_patch2_func, 570, 1, 2 }, + { ahd_patch0_func, 571, 1, 1 }, + { ahd_patch1_func, 572, 1, 2 }, + { ahd_patch0_func, 573, 1, 1 }, + { ahd_patch2_func, 584, 1, 2 }, + { ahd_patch0_func, 585, 1, 1 }, + { ahd_patch16_func, 589, 1, 1 }, + { ahd_patch17_func, 594, 1, 1 }, + { ahd_patch18_func, 595, 2, 1 }, + { ahd_patch17_func, 599, 1, 2 }, + { ahd_patch0_func, 600, 1, 1 }, + { ahd_patch2_func, 603, 1, 2 }, + { ahd_patch0_func, 604, 1, 1 }, + { ahd_patch2_func, 622, 1, 2 }, + { ahd_patch0_func, 623, 1, 1 }, + { ahd_patch19_func, 624, 14, 1 }, + { ahd_patch1_func, 642, 1, 2 }, + { ahd_patch0_func, 643, 1, 1 }, + { ahd_patch19_func, 644, 1, 1 }, + { ahd_patch1_func, 656, 1, 2 }, + { ahd_patch0_func, 657, 1, 1 }, + { ahd_patch1_func, 664, 1, 2 }, + { ahd_patch0_func, 665, 1, 1 }, + { ahd_patch16_func, 688, 1, 1 }, + { ahd_patch16_func, 726, 1, 1 }, + { ahd_patch1_func, 737, 1, 2 }, + { ahd_patch0_func, 738, 1, 1 }, + { ahd_patch1_func, 755, 1, 2 }, + { ahd_patch0_func, 756, 1, 1 }, + { ahd_patch1_func, 758, 1, 2 }, + { ahd_patch0_func, 759, 1, 1 }, { ahd_patch1_func, 762, 1, 2 }, { ahd_patch0_func, 763, 1, 1 }, - { ahd_patch19_func, 765, 1, 2 }, + { ahd_patch20_func, 765, 1, 2 }, { ahd_patch0_func, 766, 2, 1 }, - { ahd_patch20_func, 769, 4, 2 }, + { ahd_patch21_func, 769, 4, 2 }, { ahd_patch0_func, 773, 1, 1 }, - { ahd_patch20_func, 780, 11, 1 } + { ahd_patch21_func, 781, 11, 1 } }; static struct cs { @@ -1112,19 +1119,16 @@ static struct cs { } critical_sections[] = { { 11, 12 }, { 13, 14 }, - { 24, 37 }, - { 38, 51 }, - { 64, 67 }, - { 94, 119 }, - { 120, 151 }, - { 153, 157 }, - { 165, 173 }, - { 196, 245 }, - { 678, 694 }, - { 694, 712 }, - { 717, 723 }, - { 726, 731 }, - { 737, 743 } + { 29, 42 }, + { 56, 59 }, + { 101, 127 }, + { 128, 156 }, + { 158, 161 }, + { 169, 177 }, + { 200, 249 }, + { 688, 704 }, + { 704, 718 }, + { 728, 732 } }; static const int num_critical_sections = sizeof(critical_sections) |
