aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aic7xxx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aic7xxx')
-rw-r--r--drivers/scsi/aic7xxx/Kconfig.aic79xx4
-rw-r--r--drivers/scsi/aic7xxx/aic79xx.h3
-rw-r--r--drivers/scsi/aic7xxx/aic79xx.reg29
-rw-r--r--drivers/scsi/aic7xxx/aic79xx.seq143
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_core.c286
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_inline.h7
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.c43
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.h10
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm_pci.c17
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_pci.c11
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_reg.h_shipped27
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped21
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_seq.h_shipped881
-rw-r--r--drivers/scsi/aic7xxx/aicasm/aicasm.c23
-rw-r--r--drivers/scsi/aic7xxx/aicasm/aicasm_gram.y19
-rw-r--r--drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h88
-rw-r--r--drivers/scsi/aic7xxx/aicasm/aicasm_scan.l27
17 files changed, 1040 insertions, 599 deletions
diff --git a/drivers/scsi/aic7xxx/Kconfig.aic79xx b/drivers/scsi/aic7xxx/Kconfig.aic79xx
index 69ed77fcb71f..7955ebe8e1e8 100644
--- a/drivers/scsi/aic7xxx/Kconfig.aic79xx
+++ b/drivers/scsi/aic7xxx/Kconfig.aic79xx
@@ -37,13 +37,13 @@ config AIC79XX_CMDS_PER_DEVICE
37config AIC79XX_RESET_DELAY_MS 37config AIC79XX_RESET_DELAY_MS
38 int "Initial bus reset delay in milli-seconds" 38 int "Initial bus reset delay in milli-seconds"
39 depends on SCSI_AIC79XX 39 depends on SCSI_AIC79XX
40 default "15000" 40 default "5000"
41 ---help--- 41 ---help---
42 The number of milliseconds to delay after an initial bus reset. 42 The number of milliseconds to delay after an initial bus reset.
43 The bus settle delay following all error recovery actions is 43 The bus settle delay following all error recovery actions is
44 dictated by the SCSI layer and is not affected by this value. 44 dictated by the SCSI layer and is not affected by this value.
45 45
46 Default: 15000 (15 seconds) 46 Default: 5000 (5 seconds)
47 47
48config AIC79XX_BUILD_FIRMWARE 48config AIC79XX_BUILD_FIRMWARE
49 bool "Build Adapter Firmware with Kernel Build" 49 bool "Build Adapter Firmware with Kernel Build"
diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h
index 2cfdbef447db..1d11f7e77564 100644
--- a/drivers/scsi/aic7xxx/aic79xx.h
+++ b/drivers/scsi/aic7xxx/aic79xx.h
@@ -37,7 +37,7 @@
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES. 38 * POSSIBILITY OF SUCH DAMAGES.
39 * 39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#108 $ 40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#109 $
41 * 41 *
42 * $FreeBSD$ 42 * $FreeBSD$
43 */ 43 */
@@ -222,6 +222,7 @@ typedef enum {
222typedef enum { 222typedef enum {
223 AHD_FENONE = 0x00000, 223 AHD_FENONE = 0x00000,
224 AHD_WIDE = 0x00001,/* Wide Channel */ 224 AHD_WIDE = 0x00001,/* Wide Channel */
225 AHD_AIC79XXB_SLOWCRC = 0x00002,/* SLOWCRC bit should be set */
225 AHD_MULTI_FUNC = 0x00100,/* Multi-Function/Channel Device */ 226 AHD_MULTI_FUNC = 0x00100,/* Multi-Function/Channel Device */
226 AHD_TARGETMODE = 0x01000,/* Has tested target mode support */ 227 AHD_TARGETMODE = 0x01000,/* Has tested target mode support */
227 AHD_MULTIROLE = 0x02000,/* Space for two roles at a time */ 228 AHD_MULTIROLE = 0x02000,/* Space for two roles at a time */
diff --git a/drivers/scsi/aic7xxx/aic79xx.reg b/drivers/scsi/aic7xxx/aic79xx.reg
index 3a3204703b15..be14e2ecb8f7 100644
--- a/drivers/scsi/aic7xxx/aic79xx.reg
+++ b/drivers/scsi/aic7xxx/aic79xx.reg
@@ -1,7 +1,7 @@
1/* 1/*
2 * Aic79xx register and scratch ram definitions. 2 * Aic79xx register and scratch ram definitions.
3 * 3 *
4 * Copyright (c) 1994-2001 Justin T. Gibbs. 4 * Copyright (c) 1994-2001, 2004 Justin T. Gibbs.
5 * Copyright (c) 2000-2002 Adaptec Inc. 5 * Copyright (c) 2000-2002 Adaptec Inc.
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
@@ -39,7 +39,7 @@
39 * 39 *
40 * $FreeBSD$ 40 * $FreeBSD$
41 */ 41 */
42VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $" 42VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#77 $"
43 43
44/* 44/*
45 * This file is processed by the aic7xxx_asm utility for use in assembling 45 * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -3715,8 +3715,9 @@ scratch_ram {
3715 3715
3716 SEQ_FLAGS2 { 3716 SEQ_FLAGS2 {
3717 size 1 3717 size 1
3718 field TARGET_MSG_PENDING 0x02 3718 field PENDING_MK_MESSAGE 0x01
3719 field SELECTOUT_QFROZEN 0x04 3719 field TARGET_MSG_PENDING 0x02
3720 field SELECTOUT_QFROZEN 0x04
3720 } 3721 }
3721 3722
3722 ALLOCFIFO_SCBPTR { 3723 ALLOCFIFO_SCBPTR {
@@ -3777,6 +3778,26 @@ scratch_ram {
3777 CMDSIZE_TABLE { 3778 CMDSIZE_TABLE {
3778 size 8 3779 size 8
3779 } 3780 }
3781 /*
3782 * When an SCB with the MK_MESSAGE flag is
3783 * queued to the controller, it cannot enter
3784 * the waiting for selection list until the
3785 * selections for any previously queued
3786 * commands to that target complete. During
3787 * the wait, the MK_MESSAGE SCB is queued
3788 * here.
3789 */
3790 MK_MESSAGE_SCB {
3791 size 2
3792 }
3793 /*
3794 * Saved SCSIID of MK_MESSAGE_SCB to avoid
3795 * an extra SCBPTR operation when deciding
3796 * if the MK_MESSAGE_SCB can be run.
3797 */
3798 MK_MESSAGE_SCSIID {
3799 size 1
3800 }
3780} 3801}
3781 3802
3782/************************* Hardware SCB Definition ****************************/ 3803/************************* Hardware SCB Definition ****************************/
diff --git a/drivers/scsi/aic7xxx/aic79xx.seq b/drivers/scsi/aic7xxx/aic79xx.seq
index bef1f9d369b6..58bc17591b54 100644
--- a/drivers/scsi/aic7xxx/aic79xx.seq
+++ b/drivers/scsi/aic7xxx/aic79xx.seq
@@ -1,7 +1,7 @@
1/* 1/*
2 * Adaptec U320 device driver firmware for Linux and FreeBSD. 2 * Adaptec U320 device driver firmware for Linux and FreeBSD.
3 * 3 *
4 * Copyright (c) 1994-2001 Justin T. Gibbs. 4 * Copyright (c) 1994-2001, 2004 Justin T. Gibbs.
5 * Copyright (c) 2000-2002 Adaptec Inc. 5 * Copyright (c) 2000-2002 Adaptec Inc.
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
@@ -40,7 +40,7 @@
40 * $FreeBSD$ 40 * $FreeBSD$
41 */ 41 */
42 42
43VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $" 43VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#120 $"
44PATCH_ARG_LIST = "struct ahd_softc *ahd" 44PATCH_ARG_LIST = "struct ahd_softc *ahd"
45PREFIX = "ahd_" 45PREFIX = "ahd_"
46 46
@@ -110,10 +110,8 @@ check_waiting_list:
110 * one last time. 110 * one last time.
111 */ 111 */
112 test SSTAT0, SELDO jnz select_out; 112 test SSTAT0, SELDO jnz select_out;
113END_CRITICAL;
114 call start_selection; 113 call start_selection;
115idle_loop_checkbus: 114idle_loop_checkbus:
116BEGIN_CRITICAL;
117 test SSTAT0, SELDO jnz select_out; 115 test SSTAT0, SELDO jnz select_out;
118END_CRITICAL; 116END_CRITICAL;
119 test SSTAT0, SELDI jnz select_in; 117 test SSTAT0, SELDI jnz select_in;
@@ -294,7 +292,6 @@ fetch_new_scb_inprog:
294 test CCSCBCTL, ARRDONE jz return; 292 test CCSCBCTL, ARRDONE jz return;
295fetch_new_scb_done: 293fetch_new_scb_done:
296 and CCSCBCTL, ~(CCARREN|CCSCBEN); 294 and CCSCBCTL, ~(CCARREN|CCSCBEN);
297 bmov REG0, SCBPTR, 2;
298 clr A; 295 clr A;
299 add CMDS_PENDING, 1; 296 add CMDS_PENDING, 1;
300 adc CMDS_PENDING[1], A; 297 adc CMDS_PENDING[1], A;
@@ -316,43 +313,117 @@ fetch_new_scb_done:
316 clr SCB_FIFO_USE_COUNT; 313 clr SCB_FIFO_USE_COUNT;
317 /* Update the next SCB address to download. */ 314 /* Update the next SCB address to download. */
318 bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4; 315 bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
316 /*
317 * NULL out the SCB links since these fields
318 * occupy the same location as SCB_NEXT_SCB_BUSADDR.
319 */
319 mvi SCB_NEXT[1], SCB_LIST_NULL; 320 mvi SCB_NEXT[1], SCB_LIST_NULL;
320 mvi SCB_NEXT2[1], SCB_LIST_NULL; 321 mvi SCB_NEXT2[1], SCB_LIST_NULL;
321 /* Increment our position in the QINFIFO. */ 322 /* Increment our position in the QINFIFO. */
322 mov NONE, SNSCB_QOFF; 323 mov NONE, SNSCB_QOFF;
324
323 /* 325 /*
324 * SCBs that want to send messages are always 326 * Save SCBID of this SCB in REG0 since
325 * queued independently. This ensures that they 327 * SCBPTR will be clobbered during target
326 * are at the head of the SCB list to select out 328 * list updates. We also record the SCB's
327 * to a target and we will see the MK_MESSAGE flag. 329 * flags so that we can refer to them even
330 * after SCBPTR has been changed.
331 */
332 bmov REG0, SCBPTR, 2;
333 mov A, SCB_CONTROL;
334
335 /*
336 * Find the tail SCB of the execution queue
337 * for this target.
328 */ 338 */
329 test SCB_CONTROL, MK_MESSAGE jnz first_new_target_scb;
330 shr SINDEX, 3, SCB_SCSIID; 339 shr SINDEX, 3, SCB_SCSIID;
331 and SINDEX, ~0x1; 340 and SINDEX, ~0x1;
332 mvi SINDEX[1], (WAITING_SCB_TAILS >> 8); 341 mvi SINDEX[1], (WAITING_SCB_TAILS >> 8);
333 bmov DINDEX, SINDEX, 2; 342 bmov DINDEX, SINDEX, 2;
334 bmov SCBPTR, SINDIR, 2; 343 bmov SCBPTR, SINDIR, 2;
344
345 /*
346 * Update the tail to point to the new SCB.
347 */
335 bmov DINDIR, REG0, 2; 348 bmov DINDIR, REG0, 2;
349
350 /*
351 * If the queue was empty, queue this SCB as
352 * the first for this target.
353 */
336 cmp SCBPTR[1], SCB_LIST_NULL je first_new_target_scb; 354 cmp SCBPTR[1], SCB_LIST_NULL je first_new_target_scb;
355
356 /*
357 * SCBs that want to send messages must always be
358 * at the head of their per-target queue so that
359 * ATN can be asserted even if the current
360 * negotiation agreement is packetized. If the
361 * target queue is empty, the SCB can be queued
362 * immediately. If the queue is not empty, we must
363 * wait for it to empty before entering this SCB
364 * into the waiting for selection queue. Otherwise
365 * our batching and round-robin selection scheme
366 * could allow commands to be queued out of order.
367 * To simplify the implementation, we stop pulling
368 * new commands from the host until the MK_MESSAGE
369 * SCB can be queued to the waiting for selection
370 * list.
371 */
372 test A, MK_MESSAGE jz batch_scb;
373
374 /*
375 * If the last SCB is also a MK_MESSAGE SCB, then
376 * order is preserved even if we batch.
377 */
378 test SCB_CONTROL, MK_MESSAGE jz batch_scb;
379
380 /*
381 * Defer this SCB and stop fetching new SCBs until
382 * it can be queued. Since the SCB_SCSIID of the
383 * tail SCB must be the same as that of the newly
384 * queued SCB, there is no need to restore the SCBID
385 * here.
386 */
387 or SEQ_FLAGS2, PENDING_MK_MESSAGE;
388 bmov MK_MESSAGE_SCB, REG0, 2;
389 mov MK_MESSAGE_SCSIID, SCB_SCSIID ret;
390
391batch_scb:
392 /*
393 * Otherwise just update the previous tail SCB to
394 * point to the new tail.
395 */
337 bmov SCB_NEXT, REG0, 2 ret; 396 bmov SCB_NEXT, REG0, 2 ret;
397
338first_new_target_scb: 398first_new_target_scb:
399 /*
400 * Append SCB to the tail of the waiting for
401 * selection list.
402 */
339 cmp WAITING_TID_HEAD[1], SCB_LIST_NULL je first_new_scb; 403 cmp WAITING_TID_HEAD[1], SCB_LIST_NULL je first_new_scb;
340 bmov SCBPTR, WAITING_TID_TAIL, 2; 404 bmov SCBPTR, WAITING_TID_TAIL, 2;
341 bmov SCB_NEXT2, REG0, 2; 405 bmov SCB_NEXT2, REG0, 2;
342 bmov WAITING_TID_TAIL, REG0, 2 ret; 406 bmov WAITING_TID_TAIL, REG0, 2 ret;
343first_new_scb: 407first_new_scb:
408 /*
409 * Whole list is empty, so the head of
410 * the list must be initialized too.
411 */
344 bmov WAITING_TID_HEAD, REG0, 2; 412 bmov WAITING_TID_HEAD, REG0, 2;
345 bmov WAITING_TID_TAIL, REG0, 2 ret; 413 bmov WAITING_TID_TAIL, REG0, 2 ret;
346END_CRITICAL; 414END_CRITICAL;
347 415
348scbdma_idle: 416scbdma_idle:
349 /* 417 /*
350 * Give precedence to downloading new SCBs to execute 418 * Don't bother downloading new SCBs to execute
351 * unless select-outs are currently frozen. 419 * if select-outs are currently frozen or we have
420 * a MK_MESSAGE SCB waiting to enter the queue.
352 */ 421 */
353 test SEQ_FLAGS2, SELECTOUT_QFROZEN jnz . + 2; 422 test SEQ_FLAGS2, SELECTOUT_QFROZEN|PENDING_MK_MESSAGE
423 jnz scbdma_no_new_scbs;
354BEGIN_CRITICAL; 424BEGIN_CRITICAL;
355 test QOFF_CTLSTA, NEW_SCB_AVAIL jnz fetch_new_scb; 425 test QOFF_CTLSTA, NEW_SCB_AVAIL jnz fetch_new_scb;
426scbdma_no_new_scbs:
356 cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne dma_complete_scb; 427 cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne dma_complete_scb;
357 cmp COMPLETE_SCB_HEAD[1], SCB_LIST_NULL je return; 428 cmp COMPLETE_SCB_HEAD[1], SCB_LIST_NULL je return;
358 /* FALLTHROUGH */ 429 /* FALLTHROUGH */
@@ -671,27 +742,41 @@ curscb_ww_done:
671 } 742 }
672 743
673 /* 744 /*
674 * Requeue any SCBs not sent, to the tail of the waiting Q. 745 * The whole list made it. Clear our tail pointer to indicate
746 * that the per-target selection queue is now empty.
675 */ 747 */
676 cmp SCB_NEXT[1], SCB_LIST_NULL je select_out_list_done; 748 cmp SCB_NEXT[1], SCB_LIST_NULL je select_out_clear_tail;
677 749
678 /* 750 /*
751 * Requeue any SCBs not sent, to the tail of the waiting Q.
679 * We know that neither the per-TID list nor the list of 752 * We know that neither the per-TID list nor the list of
680 * TIDs is empty. Use this knowledge to our advantage. 753 * TIDs is empty. Use this knowledge to our advantage and
754 * queue the remainder to the tail of the global execution
755 * queue.
681 */ 756 */
682 bmov REG0, SCB_NEXT, 2; 757 bmov REG0, SCB_NEXT, 2;
758select_out_queue_remainder:
683 bmov SCBPTR, WAITING_TID_TAIL, 2; 759 bmov SCBPTR, WAITING_TID_TAIL, 2;
684 bmov SCB_NEXT2, REG0, 2; 760 bmov SCB_NEXT2, REG0, 2;
685 bmov WAITING_TID_TAIL, REG0, 2; 761 bmov WAITING_TID_TAIL, REG0, 2;
686 jmp select_out_inc_tid_q; 762 jmp select_out_inc_tid_q;
687 763
688select_out_list_done: 764select_out_clear_tail:
765 /*
766 * Queue any pending MK_MESSAGE SCB for this target now
767 * that the queue is empty.
768 */
769 test SEQ_FLAGS2, PENDING_MK_MESSAGE jz select_out_no_mk_message_scb;
770 mov A, MK_MESSAGE_SCSIID;
771 cmp SCB_SCSIID, A jne select_out_no_mk_message_scb;
772 and SEQ_FLAGS2, ~PENDING_MK_MESSAGE;
773 bmov REG0, MK_MESSAGE_SCB, 2;
774 jmp select_out_queue_remainder;
775
776select_out_no_mk_message_scb:
689 /* 777 /*
690 * The whole list made it. Just clear our TID's tail pointer 778 * Clear this target's execution tail and increment the queue.
691 * unless we were queued independently due to our need to
692 * send a message.
693 */ 779 */
694 test SCB_CONTROL, MK_MESSAGE jnz select_out_inc_tid_q;
695 shr DINDEX, 3, SCB_SCSIID; 780 shr DINDEX, 3, SCB_SCSIID;
696 or DINDEX, 1; /* Want only the second byte */ 781 or DINDEX, 1; /* Want only the second byte */
697 mvi DINDEX[1], ((WAITING_SCB_TAILS) >> 8); 782 mvi DINDEX[1], ((WAITING_SCB_TAILS) >> 8);
@@ -703,8 +788,8 @@ select_out_inc_tid_q:
703 mvi WAITING_TID_TAIL[1], SCB_LIST_NULL; 788 mvi WAITING_TID_TAIL[1], SCB_LIST_NULL;
704 bmov SCBPTR, CURRSCB, 2; 789 bmov SCBPTR, CURRSCB, 2;
705 mvi CLRSINT0, CLRSELDO; 790 mvi CLRSINT0, CLRSELDO;
706 test LQOSTAT2, LQOPHACHGOUTPKT jnz unexpected_nonpkt_phase; 791 test LQOSTAT2, LQOPHACHGOUTPKT jnz unexpected_nonpkt_mode_cleared;
707 test LQOSTAT1, LQOPHACHGINPKT jnz unexpected_nonpkt_phase; 792 test LQOSTAT1, LQOPHACHGINPKT jnz unexpected_nonpkt_mode_cleared;
708 793
709 /* 794 /*
710 * If this is a packetized connection, return to our 795 * If this is a packetized connection, return to our
@@ -2127,6 +2212,18 @@ SET_DST_MODE M_DFF0;
2127 mvi DFFSXFRCTL, CLRCHN; 2212 mvi DFFSXFRCTL, CLRCHN;
2128unexpected_nonpkt_mode_cleared: 2213unexpected_nonpkt_mode_cleared:
2129 mvi CLRSINT2, CLRNONPACKREQ; 2214 mvi CLRSINT2, CLRNONPACKREQ;
2215 if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
2216 /*
2217 * Test to ensure that the bus has not
2218 * already gone free prior to clearing
2219 * any stale busfree status. This avoids
2220 * a window whereby a busfree just after
2221 * a selection could be missed.
2222 */
2223 test SCSISIGI, BSYI jz . + 2;
2224 mvi CLRSINT1,CLRBUSFREE;
2225 or SIMODE1, ENBUSFREE;
2226 }
2130 test SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase; 2227 test SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase;
2131 SET_SEQINTCODE(ENTERING_NONPACK) 2228 SET_SEQINTCODE(ENTERING_NONPACK)
2132 jmp ITloop; 2229 jmp ITloop;
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c
index db8f5ce99ee3..342f77966a5b 100644
--- a/drivers/scsi/aic7xxx/aic79xx_core.c
+++ b/drivers/scsi/aic7xxx/aic79xx_core.c
@@ -37,7 +37,7 @@
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES. 38 * POSSIBILITY OF SUCH DAMAGES.
39 * 39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#247 $ 40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#250 $
41 */ 41 */
42 42
43#ifdef __linux__ 43#ifdef __linux__
@@ -197,7 +197,8 @@ static int ahd_search_scb_list(struct ahd_softc *ahd, int target,
197 char channel, int lun, u_int tag, 197 char channel, int lun, u_int tag,
198 role_t role, uint32_t status, 198 role_t role, uint32_t status,
199 ahd_search_action action, 199 ahd_search_action action,
200 u_int *list_head, u_int tid); 200 u_int *list_head, u_int *list_tail,
201 u_int tid);
201static void ahd_stitch_tid_list(struct ahd_softc *ahd, 202static void ahd_stitch_tid_list(struct ahd_softc *ahd,
202 u_int tid_prev, u_int tid_cur, 203 u_int tid_prev, u_int tid_cur,
203 u_int tid_next); 204 u_int tid_next);
@@ -1660,7 +1661,8 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat)
1660 * so just clear the error. 1661 * so just clear the error.
1661 */ 1662 */
1662 ahd_outb(ahd, CLRLQIINT1, CLRLQICRCI_NLQ); 1663 ahd_outb(ahd, CLRLQIINT1, CLRLQICRCI_NLQ);
1663 } else if ((status & BUSFREE) != 0) { 1664 } else if ((status & BUSFREE) != 0
1665 || (lqistat1 & LQOBUSFREE) != 0) {
1664 u_int lqostat1; 1666 u_int lqostat1;
1665 int restart; 1667 int restart;
1666 int clear_fifo; 1668 int clear_fifo;
@@ -2025,10 +2027,6 @@ ahd_handle_pkt_busfree(struct ahd_softc *ahd, u_int busfreetime)
2025 u_int waiting_t; 2027 u_int waiting_t;
2026 u_int next; 2028 u_int next;
2027 2029
2028 if ((busfreetime & BUSFREE_LQO) == 0)
2029 printf("%s: Warning, BUSFREE time is 0x%x. "
2030 "Expected BUSFREE_LQO.\n",
2031 ahd_name(ahd), busfreetime);
2032 /* 2030 /*
2033 * The LQO manager detected an unexpected busfree 2031 * The LQO manager detected an unexpected busfree
2034 * either: 2032 * either:
@@ -2251,8 +2249,14 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
2251 struct ahd_tmode_tstate *tstate; 2249 struct ahd_tmode_tstate *tstate;
2252 2250
2253 /* 2251 /*
2254 * PPR Rejected. Try non-ppr negotiation 2252 * PPR Rejected.
2255 * and retry command. 2253 *
2254 * If the previous negotiation was packetized,
2255 * this could be because the device has been
2256 * reset without our knowledge. Force our
2257 * current negotiation to async and retry the
2258 * negotiation. Otherwise retry the command
2259 * with non-ppr negotiation.
2256 */ 2260 */
2257#ifdef AHD_DEBUG 2261#ifdef AHD_DEBUG
2258 if ((ahd_debug & AHD_SHOW_MESSAGES) != 0) 2262 if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
@@ -2261,11 +2265,34 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
2261 tinfo = ahd_fetch_transinfo(ahd, devinfo.channel, 2265 tinfo = ahd_fetch_transinfo(ahd, devinfo.channel,
2262 devinfo.our_scsiid, 2266 devinfo.our_scsiid,
2263 devinfo.target, &tstate); 2267 devinfo.target, &tstate);
2264 tinfo->curr.transport_version = 2; 2268 if ((tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ)!=0) {
2265 tinfo->goal.transport_version = 2; 2269 ahd_set_width(ahd, &devinfo,
2266 tinfo->goal.ppr_options = 0; 2270 MSG_EXT_WDTR_BUS_8_BIT,
2267 ahd_qinfifo_requeue_tail(ahd, scb); 2271 AHD_TRANS_CUR,
2268 printerror = 0; 2272 /*paused*/TRUE);
2273 ahd_set_syncrate(ahd, &devinfo,
2274 /*period*/0, /*offset*/0,
2275 /*ppr_options*/0,
2276 AHD_TRANS_CUR,
2277 /*paused*/TRUE);
2278 /*
2279 * The expect PPR busfree handler below
2280 * will effect the retry and necessary
2281 * abort.
2282 */
2283 } else {
2284 tinfo->curr.transport_version = 2;
2285 tinfo->goal.transport_version = 2;
2286 tinfo->goal.ppr_options = 0;
2287 /*
2288 * Remove any SCBs in the waiting for selection
2289 * queue that may also be for this target so
2290 * that command ordering is preserved.
2291 */
2292 ahd_freeze_devq(ahd, scb);
2293 ahd_qinfifo_requeue_tail(ahd, scb);
2294 printerror = 0;
2295 }
2269 } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE) 2296 } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE)
2270 && ppr_busfree == 0) { 2297 && ppr_busfree == 0) {
2271 /* 2298 /*
@@ -2280,6 +2307,12 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
2280 MSG_EXT_WDTR_BUS_8_BIT, 2307 MSG_EXT_WDTR_BUS_8_BIT,
2281 AHD_TRANS_CUR|AHD_TRANS_GOAL, 2308 AHD_TRANS_CUR|AHD_TRANS_GOAL,
2282 /*paused*/TRUE); 2309 /*paused*/TRUE);
2310 /*
2311 * Remove any SCBs in the waiting for selection
2312 * queue that may also be for this target so that
2313 * command ordering is preserved.
2314 */
2315 ahd_freeze_devq(ahd, scb);
2283 ahd_qinfifo_requeue_tail(ahd, scb); 2316 ahd_qinfifo_requeue_tail(ahd, scb);
2284 printerror = 0; 2317 printerror = 0;
2285 } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE) 2318 } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE)
@@ -2297,6 +2330,12 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
2297 /*ppr_options*/0, 2330 /*ppr_options*/0,
2298 AHD_TRANS_CUR|AHD_TRANS_GOAL, 2331 AHD_TRANS_CUR|AHD_TRANS_GOAL,
2299 /*paused*/TRUE); 2332 /*paused*/TRUE);
2333 /*
2334 * Remove any SCBs in the waiting for selection
2335 * queue that may also be for this target so that
2336 * command ordering is preserved.
2337 */
2338 ahd_freeze_devq(ahd, scb);
2300 ahd_qinfifo_requeue_tail(ahd, scb); 2339 ahd_qinfifo_requeue_tail(ahd, scb);
2301 printerror = 0; 2340 printerror = 0;
2302 } else if ((ahd->msg_flags & MSG_FLAG_EXPECT_IDE_BUSFREE) != 0 2341 } else if ((ahd->msg_flags & MSG_FLAG_EXPECT_IDE_BUSFREE) != 0
@@ -2369,14 +2408,14 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
2369 */ 2408 */
2370 printf("%s: ", ahd_name(ahd)); 2409 printf("%s: ", ahd_name(ahd));
2371 } 2410 }
2372 if (lastphase != P_BUSFREE)
2373 ahd_force_renegotiation(ahd, &devinfo);
2374 printf("Unexpected busfree %s, %d SCBs aborted, " 2411 printf("Unexpected busfree %s, %d SCBs aborted, "
2375 "PRGMCNT == 0x%x\n", 2412 "PRGMCNT == 0x%x\n",
2376 ahd_lookup_phase_entry(lastphase)->phasemsg, 2413 ahd_lookup_phase_entry(lastphase)->phasemsg,
2377 aborted, 2414 aborted,
2378 ahd_inw(ahd, PRGMCNT)); 2415 ahd_inw(ahd, PRGMCNT));
2379 ahd_dump_card_state(ahd); 2416 ahd_dump_card_state(ahd);
2417 if (lastphase != P_BUSFREE)
2418 ahd_force_renegotiation(ahd, &devinfo);
2380 } 2419 }
2381 /* Always restart the sequencer. */ 2420 /* Always restart the sequencer. */
2382 return (1); 2421 return (1);
@@ -3293,6 +3332,15 @@ ahd_update_neg_table(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
3293 con_opts |= WIDEXFER; 3332 con_opts |= WIDEXFER;
3294 3333
3295 /* 3334 /*
3335 * Slow down our CRC interval to be
3336 * compatible with packetized U320 devices
3337 * that can't handle a CRC at full speed
3338 */
3339 if (ahd->features & AHD_AIC79XXB_SLOWCRC) {
3340 con_opts |= ENSLOWCRC;
3341 }
3342
3343 /*
3296 * During packetized transfers, the target will 3344 * During packetized transfers, the target will
3297 * give us the oportunity to send command packets 3345 * give us the oportunity to send command packets
3298 * without us asserting attention. 3346 * without us asserting attention.
@@ -3315,7 +3363,6 @@ ahd_update_pending_scbs(struct ahd_softc *ahd)
3315{ 3363{
3316 struct scb *pending_scb; 3364 struct scb *pending_scb;
3317 int pending_scb_count; 3365 int pending_scb_count;
3318 u_int scb_tag;
3319 int paused; 3366 int paused;
3320 u_int saved_scbptr; 3367 u_int saved_scbptr;
3321 ahd_mode_state saved_modes; 3368 ahd_mode_state saved_modes;
@@ -3333,7 +3380,6 @@ ahd_update_pending_scbs(struct ahd_softc *ahd)
3333 pending_scb_count = 0; 3380 pending_scb_count = 0;
3334 LIST_FOREACH(pending_scb, &ahd->pending_scbs, pending_links) { 3381 LIST_FOREACH(pending_scb, &ahd->pending_scbs, pending_links) {
3335 struct ahd_devinfo devinfo; 3382 struct ahd_devinfo devinfo;
3336 struct hardware_scb *pending_hscb;
3337 struct ahd_initiator_tinfo *tinfo; 3383 struct ahd_initiator_tinfo *tinfo;
3338 struct ahd_tmode_tstate *tstate; 3384 struct ahd_tmode_tstate *tstate;
3339 3385
@@ -3341,11 +3387,10 @@ ahd_update_pending_scbs(struct ahd_softc *ahd)
3341 tinfo = ahd_fetch_transinfo(ahd, devinfo.channel, 3387 tinfo = ahd_fetch_transinfo(ahd, devinfo.channel,
3342 devinfo.our_scsiid, 3388 devinfo.our_scsiid,
3343 devinfo.target, &tstate); 3389 devinfo.target, &tstate);
3344 pending_hscb = pending_scb->hscb;
3345 if ((tstate->auto_negotiate & devinfo.target_mask) == 0 3390 if ((tstate->auto_negotiate & devinfo.target_mask) == 0
3346 && (pending_scb->flags & SCB_AUTO_NEGOTIATE) != 0) { 3391 && (pending_scb->flags & SCB_AUTO_NEGOTIATE) != 0) {
3347 pending_scb->flags &= ~SCB_AUTO_NEGOTIATE; 3392 pending_scb->flags &= ~SCB_AUTO_NEGOTIATE;
3348 pending_hscb->control &= ~MK_MESSAGE; 3393 pending_scb->hscb->control &= ~MK_MESSAGE;
3349 } 3394 }
3350 ahd_sync_scb(ahd, pending_scb, 3395 ahd_sync_scb(ahd, pending_scb,
3351 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 3396 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
@@ -3377,18 +3422,15 @@ ahd_update_pending_scbs(struct ahd_softc *ahd)
3377 ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO); 3422 ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
3378 saved_scbptr = ahd_get_scbptr(ahd); 3423 saved_scbptr = ahd_get_scbptr(ahd);
3379 /* Ensure that the hscbs down on the card match the new information */ 3424 /* Ensure that the hscbs down on the card match the new information */
3380 for (scb_tag = 0; scb_tag < ahd->scb_data.maxhscbs; scb_tag++) { 3425 LIST_FOREACH(pending_scb, &ahd->pending_scbs, pending_links) {
3381 struct hardware_scb *pending_hscb; 3426 u_int scb_tag;
3382 u_int control; 3427 u_int control;
3383 3428
3384 pending_scb = ahd_lookup_scb(ahd, scb_tag); 3429 scb_tag = SCB_GET_TAG(pending_scb);
3385 if (pending_scb == NULL)
3386 continue;
3387 ahd_set_scbptr(ahd, scb_tag); 3430 ahd_set_scbptr(ahd, scb_tag);
3388 pending_hscb = pending_scb->hscb;
3389 control = ahd_inb_scbram(ahd, SCB_CONTROL); 3431 control = ahd_inb_scbram(ahd, SCB_CONTROL);
3390 control &= ~MK_MESSAGE; 3432 control &= ~MK_MESSAGE;
3391 control |= pending_hscb->control & MK_MESSAGE; 3433 control |= pending_scb->hscb->control & MK_MESSAGE;
3392 ahd_outb(ahd, SCB_CONTROL, control); 3434 ahd_outb(ahd, SCB_CONTROL, control);
3393 } 3435 }
3394 ahd_set_scbptr(ahd, saved_scbptr); 3436 ahd_set_scbptr(ahd, saved_scbptr);
@@ -6500,13 +6542,14 @@ ahd_chip_init(struct ahd_softc *ahd)
6500 | ENLQIOVERI_LQ|ENLQIOVERI_NLQ); 6542 | ENLQIOVERI_LQ|ENLQIOVERI_NLQ);
6501 ahd_outb(ahd, LQOMODE0, ENLQOATNLQ|ENLQOATNPKT|ENLQOTCRC); 6543 ahd_outb(ahd, LQOMODE0, ENLQOATNLQ|ENLQOATNPKT|ENLQOTCRC);
6502 /* 6544 /*
6503 * An interrupt from LQOBUSFREE is made redundant by the 6545 * We choose to have the sequencer catch LQOPHCHGINPKT errors
6504 * BUSFREE interrupt. We choose to have the sequencer catch 6546 * manually for the command phase at the start of a packetized
6505 * LQOPHCHGINPKT errors manually for the command phase at the 6547 * selection case. ENLQOBUSFREE should be made redundant by
6506 * start of a packetized selection case. 6548 * the BUSFREE interrupt, but it seems that some LQOBUSFREE
6507 ahd_outb(ahd, LQOMODE1, ENLQOBUSFREE|ENLQOPHACHGINPKT); 6549 * events fail to assert the BUSFREE interrupt so we must
6550 * also enable LQOBUSFREE interrupts.
6508 */ 6551 */
6509 ahd_outb(ahd, LQOMODE1, 0); 6552 ahd_outb(ahd, LQOMODE1, ENLQOBUSFREE);
6510 6553
6511 /* 6554 /*
6512 * Setup sequencer interrupt handlers. 6555 * Setup sequencer interrupt handlers.
@@ -6617,6 +6660,8 @@ ahd_chip_init(struct ahd_softc *ahd)
6617 /* We don't have any waiting selections */ 6660 /* We don't have any waiting selections */
6618 ahd_outw(ahd, WAITING_TID_HEAD, SCB_LIST_NULL); 6661 ahd_outw(ahd, WAITING_TID_HEAD, SCB_LIST_NULL);
6619 ahd_outw(ahd, WAITING_TID_TAIL, SCB_LIST_NULL); 6662 ahd_outw(ahd, WAITING_TID_TAIL, SCB_LIST_NULL);
6663 ahd_outw(ahd, MK_MESSAGE_SCB, SCB_LIST_NULL);
6664 ahd_outw(ahd, MK_MESSAGE_SCSIID, 0xFF);
6620 for (i = 0; i < AHD_NUM_TARGETS; i++) 6665 for (i = 0; i < AHD_NUM_TARGETS; i++)
6621 ahd_outw(ahd, WAITING_SCB_TAILS + (2 * i), SCB_LIST_NULL); 6666 ahd_outw(ahd, WAITING_SCB_TAILS + (2 * i), SCB_LIST_NULL);
6622 6667
@@ -6704,6 +6749,18 @@ ahd_chip_init(struct ahd_softc *ahd)
6704 6749
6705 ahd_loadseq(ahd); 6750 ahd_loadseq(ahd);
6706 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); 6751 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
6752
6753 if (ahd->features & AHD_AIC79XXB_SLOWCRC) {
6754 u_int negodat3 = ahd_inb(ahd, NEGCONOPTS);
6755
6756 negodat3 |= ENSLOWCRC;
6757 ahd_outb(ahd, NEGCONOPTS, negodat3);
6758 negodat3 = ahd_inb(ahd, NEGCONOPTS);
6759 if (!(negodat3 & ENSLOWCRC))
6760 printf("aic79xx: failed to set the SLOWCRC bit\n");
6761 else
6762 printf("aic79xx: SLOWCRC bit set\n");
6763 }
6707} 6764}
6708 6765
6709/* 6766/*
@@ -7260,12 +7317,28 @@ ahd_reset_cmds_pending(struct ahd_softc *ahd)
7260 ahd->flags &= ~AHD_UPDATE_PEND_CMDS; 7317 ahd->flags &= ~AHD_UPDATE_PEND_CMDS;
7261} 7318}
7262 7319
7320void
7321ahd_done_with_status(struct ahd_softc *ahd, struct scb *scb, uint32_t status)
7322{
7323 cam_status ostat;
7324 cam_status cstat;
7325
7326 ostat = ahd_get_transaction_status(scb);
7327 if (ostat == CAM_REQ_INPROG)
7328 ahd_set_transaction_status(scb, status);
7329 cstat = ahd_get_transaction_status(scb);
7330 if (cstat != CAM_REQ_CMP)
7331 ahd_freeze_scb(scb);
7332 ahd_done(ahd, scb);
7333}
7334
7263int 7335int
7264ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, 7336ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7265 int lun, u_int tag, role_t role, uint32_t status, 7337 int lun, u_int tag, role_t role, uint32_t status,
7266 ahd_search_action action) 7338 ahd_search_action action)
7267{ 7339{
7268 struct scb *scb; 7340 struct scb *scb;
7341 struct scb *mk_msg_scb;
7269 struct scb *prev_scb; 7342 struct scb *prev_scb;
7270 ahd_mode_state saved_modes; 7343 ahd_mode_state saved_modes;
7271 u_int qinstart; 7344 u_int qinstart;
@@ -7274,6 +7347,7 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7274 u_int tid_next; 7347 u_int tid_next;
7275 u_int tid_prev; 7348 u_int tid_prev;
7276 u_int scbid; 7349 u_int scbid;
7350 u_int seq_flags2;
7277 u_int savedscbptr; 7351 u_int savedscbptr;
7278 uint32_t busaddr; 7352 uint32_t busaddr;
7279 int found; 7353 int found;
@@ -7329,23 +7403,10 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7329 found++; 7403 found++;
7330 switch (action) { 7404 switch (action) {
7331 case SEARCH_COMPLETE: 7405 case SEARCH_COMPLETE:
7332 {
7333 cam_status ostat;
7334 cam_status cstat;
7335
7336 ostat = ahd_get_transaction_status(scb);
7337 if (ostat == CAM_REQ_INPROG)
7338 ahd_set_transaction_status(scb,
7339 status);
7340 cstat = ahd_get_transaction_status(scb);
7341 if (cstat != CAM_REQ_CMP)
7342 ahd_freeze_scb(scb);
7343 if ((scb->flags & SCB_ACTIVE) == 0) 7406 if ((scb->flags & SCB_ACTIVE) == 0)
7344 printf("Inactive SCB in qinfifo\n"); 7407 printf("Inactive SCB in qinfifo\n");
7345 ahd_done(ahd, scb); 7408 ahd_done_with_status(ahd, scb, status);
7346
7347 /* FALLTHROUGH */ 7409 /* FALLTHROUGH */
7348 }
7349 case SEARCH_REMOVE: 7410 case SEARCH_REMOVE:
7350 break; 7411 break;
7351 case SEARCH_PRINT: 7412 case SEARCH_PRINT:
@@ -7375,21 +7436,24 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7375 * looking for matches. 7436 * looking for matches.
7376 */ 7437 */
7377 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); 7438 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
7439 seq_flags2 = ahd_inb(ahd, SEQ_FLAGS2);
7440 if ((seq_flags2 & PENDING_MK_MESSAGE) != 0) {
7441 scbid = ahd_inw(ahd, MK_MESSAGE_SCB);
7442 mk_msg_scb = ahd_lookup_scb(ahd, scbid);
7443 } else
7444 mk_msg_scb = NULL;
7378 savedscbptr = ahd_get_scbptr(ahd); 7445 savedscbptr = ahd_get_scbptr(ahd);
7379 tid_next = ahd_inw(ahd, WAITING_TID_HEAD); 7446 tid_next = ahd_inw(ahd, WAITING_TID_HEAD);
7380 tid_prev = SCB_LIST_NULL; 7447 tid_prev = SCB_LIST_NULL;
7381 targets = 0; 7448 targets = 0;
7382 for (scbid = tid_next; !SCBID_IS_NULL(scbid); scbid = tid_next) { 7449 for (scbid = tid_next; !SCBID_IS_NULL(scbid); scbid = tid_next) {
7383 u_int tid_head; 7450 u_int tid_head;
7451 u_int tid_tail;
7384 7452
7385 /*
7386 * We limit based on the number of SCBs since
7387 * MK_MESSAGE SCBs are not in the per-tid lists.
7388 */
7389 targets++; 7453 targets++;
7390 if (targets > AHD_SCB_MAX) { 7454 if (targets > AHD_NUM_TARGETS)
7391 panic("TID LIST LOOP"); 7455 panic("TID LIST LOOP");
7392 } 7456
7393 if (scbid >= ahd->scb_data.numscbs) { 7457 if (scbid >= ahd->scb_data.numscbs) {
7394 printf("%s: Waiting TID List inconsistency. " 7458 printf("%s: Waiting TID List inconsistency. "
7395 "SCB index == 0x%x, yet numscbs == 0x%x.", 7459 "SCB index == 0x%x, yet numscbs == 0x%x.",
@@ -7419,8 +7483,71 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7419 tid_head = scbid; 7483 tid_head = scbid;
7420 found += ahd_search_scb_list(ahd, target, channel, 7484 found += ahd_search_scb_list(ahd, target, channel,
7421 lun, tag, role, status, 7485 lun, tag, role, status,
7422 action, &tid_head, 7486 action, &tid_head, &tid_tail,
7423 SCB_GET_TARGET(ahd, scb)); 7487 SCB_GET_TARGET(ahd, scb));
7488 /*
7489 * Check any MK_MESSAGE SCB that is still waiting to
7490 * enter this target's waiting for selection queue.
7491 */
7492 if (mk_msg_scb != NULL
7493 && ahd_match_scb(ahd, mk_msg_scb, target, channel,
7494 lun, tag, role)) {
7495
7496 /*
7497 * We found an scb that needs to be acted on.
7498 */
7499 found++;
7500 switch (action) {
7501 case SEARCH_COMPLETE:
7502 if ((mk_msg_scb->flags & SCB_ACTIVE) == 0)
7503 printf("Inactive SCB pending MK_MSG\n");
7504 ahd_done_with_status(ahd, mk_msg_scb, status);
7505 /* FALLTHROUGH */
7506 case SEARCH_REMOVE:
7507 {
7508 u_int tail_offset;
7509
7510 printf("Removing MK_MSG scb\n");
7511
7512 /*
7513 * Reset our tail to the tail of the
7514 * main per-target list.
7515 */
7516 tail_offset = WAITING_SCB_TAILS
7517 + (2 * SCB_GET_TARGET(ahd, mk_msg_scb));
7518 ahd_outw(ahd, tail_offset, tid_tail);
7519
7520 seq_flags2 &= ~PENDING_MK_MESSAGE;
7521 ahd_outb(ahd, SEQ_FLAGS2, seq_flags2);
7522 ahd_outw(ahd, CMDS_PENDING,
7523 ahd_inw(ahd, CMDS_PENDING)-1);
7524 mk_msg_scb = NULL;
7525 break;
7526 }
7527 case SEARCH_PRINT:
7528 printf(" 0x%x", SCB_GET_TAG(scb));
7529 /* FALLTHROUGH */
7530 case SEARCH_COUNT:
7531 break;
7532 }
7533 }
7534
7535 if (mk_msg_scb != NULL
7536 && SCBID_IS_NULL(tid_head)
7537 && ahd_match_scb(ahd, scb, target, channel, CAM_LUN_WILDCARD,
7538 SCB_LIST_NULL, ROLE_UNKNOWN)) {
7539
7540 /*
7541 * When removing the last SCB for a target
7542 * queue with a pending MK_MESSAGE scb, we
7543 * must queue the MK_MESSAGE scb.
7544 */
7545 printf("Queueing mk_msg_scb\n");
7546 tid_head = ahd_inw(ahd, MK_MESSAGE_SCB);
7547 seq_flags2 &= ~PENDING_MK_MESSAGE;
7548 ahd_outb(ahd, SEQ_FLAGS2, seq_flags2);
7549 mk_msg_scb = NULL;
7550 }
7424 if (tid_head != scbid) 7551 if (tid_head != scbid)
7425 ahd_stitch_tid_list(ahd, tid_prev, tid_head, tid_next); 7552 ahd_stitch_tid_list(ahd, tid_prev, tid_head, tid_next);
7426 if (!SCBID_IS_NULL(tid_head)) 7553 if (!SCBID_IS_NULL(tid_head))
@@ -7428,6 +7555,8 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7428 if (action == SEARCH_PRINT) 7555 if (action == SEARCH_PRINT)
7429 printf(")\n"); 7556 printf(")\n");
7430 } 7557 }
7558
7559 /* Restore saved state. */
7431 ahd_set_scbptr(ahd, savedscbptr); 7560 ahd_set_scbptr(ahd, savedscbptr);
7432 ahd_restore_modes(ahd, saved_modes); 7561 ahd_restore_modes(ahd, saved_modes);
7433 return (found); 7562 return (found);
@@ -7436,7 +7565,8 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
7436static int 7565static int
7437ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel, 7566ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
7438 int lun, u_int tag, role_t role, uint32_t status, 7567 int lun, u_int tag, role_t role, uint32_t status,
7439 ahd_search_action action, u_int *list_head, u_int tid) 7568 ahd_search_action action, u_int *list_head,
7569 u_int *list_tail, u_int tid)
7440{ 7570{
7441 struct scb *scb; 7571 struct scb *scb;
7442 u_int scbid; 7572 u_int scbid;
@@ -7448,6 +7578,7 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
7448 found = 0; 7578 found = 0;
7449 prev = SCB_LIST_NULL; 7579 prev = SCB_LIST_NULL;
7450 next = *list_head; 7580 next = *list_head;
7581 *list_tail = SCB_LIST_NULL;
7451 for (scbid = next; !SCBID_IS_NULL(scbid); scbid = next) { 7582 for (scbid = next; !SCBID_IS_NULL(scbid); scbid = next) {
7452 if (scbid >= ahd->scb_data.numscbs) { 7583 if (scbid >= ahd->scb_data.numscbs) {
7453 printf("%s:SCB List inconsistency. " 7584 printf("%s:SCB List inconsistency. "
@@ -7463,6 +7594,7 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
7463 panic("Waiting List traversal\n"); 7594 panic("Waiting List traversal\n");
7464 } 7595 }
7465 ahd_set_scbptr(ahd, scbid); 7596 ahd_set_scbptr(ahd, scbid);
7597 *list_tail = scbid;
7466 next = ahd_inw_scbram(ahd, SCB_NEXT); 7598 next = ahd_inw_scbram(ahd, SCB_NEXT);
7467 if (ahd_match_scb(ahd, scb, target, channel, 7599 if (ahd_match_scb(ahd, scb, target, channel,
7468 lun, SCB_LIST_NULL, role) == 0) { 7600 lun, SCB_LIST_NULL, role) == 0) {
@@ -7472,24 +7604,14 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
7472 found++; 7604 found++;
7473 switch (action) { 7605 switch (action) {
7474 case SEARCH_COMPLETE: 7606 case SEARCH_COMPLETE:
7475 {
7476 cam_status ostat;
7477 cam_status cstat;
7478
7479 ostat = ahd_get_transaction_status(scb);
7480 if (ostat == CAM_REQ_INPROG)
7481 ahd_set_transaction_status(scb, status);
7482 cstat = ahd_get_transaction_status(scb);
7483 if (cstat != CAM_REQ_CMP)
7484 ahd_freeze_scb(scb);
7485 if ((scb->flags & SCB_ACTIVE) == 0) 7607 if ((scb->flags & SCB_ACTIVE) == 0)
7486 printf("Inactive SCB in Waiting List\n"); 7608 printf("Inactive SCB in Waiting List\n");
7487 ahd_done(ahd, scb); 7609 ahd_done_with_status(ahd, scb, status);
7488 /* FALLTHROUGH */ 7610 /* FALLTHROUGH */
7489 }
7490 case SEARCH_REMOVE: 7611 case SEARCH_REMOVE:
7491 ahd_rem_wscb(ahd, scbid, prev, next, tid); 7612 ahd_rem_wscb(ahd, scbid, prev, next, tid);
7492 if (prev == SCB_LIST_NULL) 7613 *list_tail = prev;
7614 if (SCBID_IS_NULL(prev))
7493 *list_head = next; 7615 *list_head = next;
7494 break; 7616 break;
7495 case SEARCH_PRINT: 7617 case SEARCH_PRINT:
@@ -7558,14 +7680,17 @@ ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid,
7558 } 7680 }
7559 7681
7560 /* 7682 /*
7561 * SCBs that had MK_MESSAGE set in them will not 7683 * SCBs that have MK_MESSAGE set in them may
7562 * be queued to the per-target lists, so don't 7684 * cause the tail pointer to be updated without
7563 * blindly clear the tail pointer. 7685 * setting the next pointer of the previous tail.
7686 * Only clear the tail if the removed SCB was
7687 * the tail.
7564 */ 7688 */
7565 tail_offset = WAITING_SCB_TAILS + (2 * tid); 7689 tail_offset = WAITING_SCB_TAILS + (2 * tid);
7566 if (SCBID_IS_NULL(next) 7690 if (SCBID_IS_NULL(next)
7567 && ahd_inw(ahd, tail_offset) == scbid) 7691 && ahd_inw(ahd, tail_offset) == scbid)
7568 ahd_outw(ahd, tail_offset, prev); 7692 ahd_outw(ahd, tail_offset, prev);
7693
7569 ahd_add_scb_to_free_list(ahd, scbid); 7694 ahd_add_scb_to_free_list(ahd, scbid);
7570 return (next); 7695 return (next);
7571} 7696}
@@ -8148,11 +8273,6 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
8148 ahd_setup_data_scb(ahd, scb); 8273 ahd_setup_data_scb(ahd, scb);
8149 scb->flags |= SCB_SENSE; 8274 scb->flags |= SCB_SENSE;
8150 ahd_queue_scb(ahd, scb); 8275 ahd_queue_scb(ahd, scb);
8151 /*
8152 * Ensure we have enough time to actually
8153 * retrieve the sense.
8154 */
8155 ahd_scb_timer_reset(scb, 5 * 1000000);
8156 break; 8276 break;
8157 } 8277 }
8158 case SCSI_STATUS_OK: 8278 case SCSI_STATUS_OK:
@@ -8793,6 +8913,9 @@ ahd_dump_card_state(struct ahd_softc *ahd)
8793 * Mode independent registers. 8913 * Mode independent registers.
8794 */ 8914 */
8795 cur_col = 0; 8915 cur_col = 0;
8916 ahd_intstat_print(ahd_inb(ahd, INTSTAT), &cur_col, 50);
8917 ahd_seloid_print(ahd_inb(ahd, SELOID), &cur_col, 50);
8918 ahd_selid_print(ahd_inb(ahd, SELID), &cur_col, 50);
8796 ahd_hs_mailbox_print(ahd_inb(ahd, LOCAL_HS_MAILBOX), &cur_col, 50); 8919 ahd_hs_mailbox_print(ahd_inb(ahd, LOCAL_HS_MAILBOX), &cur_col, 50);
8797 ahd_intctl_print(ahd_inb(ahd, INTCTL), &cur_col, 50); 8920 ahd_intctl_print(ahd_inb(ahd, INTCTL), &cur_col, 50);
8798 ahd_seqintstat_print(ahd_inb(ahd, SEQINTSTAT), &cur_col, 50); 8921 ahd_seqintstat_print(ahd_inb(ahd, SEQINTSTAT), &cur_col, 50);
@@ -8808,6 +8931,12 @@ ahd_dump_card_state(struct ahd_softc *ahd)
8808 ahd_seqintctl_print(ahd_inb(ahd, SEQINTCTL), &cur_col, 50); 8931 ahd_seqintctl_print(ahd_inb(ahd, SEQINTCTL), &cur_col, 50);
8809 ahd_seq_flags_print(ahd_inb(ahd, SEQ_FLAGS), &cur_col, 50); 8932 ahd_seq_flags_print(ahd_inb(ahd, SEQ_FLAGS), &cur_col, 50);
8810 ahd_seq_flags2_print(ahd_inb(ahd, SEQ_FLAGS2), &cur_col, 50); 8933 ahd_seq_flags2_print(ahd_inb(ahd, SEQ_FLAGS2), &cur_col, 50);
8934 ahd_qfreeze_count_print(ahd_inw(ahd, QFREEZE_COUNT), &cur_col, 50);
8935 ahd_kernel_qfreeze_count_print(ahd_inw(ahd, KERNEL_QFREEZE_COUNT),
8936 &cur_col, 50);
8937 ahd_mk_message_scb_print(ahd_inw(ahd, MK_MESSAGE_SCB), &cur_col, 50);
8938 ahd_mk_message_scsiid_print(ahd_inb(ahd, MK_MESSAGE_SCSIID),
8939 &cur_col, 50);
8811 ahd_sstat0_print(ahd_inb(ahd, SSTAT0), &cur_col, 50); 8940 ahd_sstat0_print(ahd_inb(ahd, SSTAT0), &cur_col, 50);
8812 ahd_sstat1_print(ahd_inb(ahd, SSTAT1), &cur_col, 50); 8941 ahd_sstat1_print(ahd_inb(ahd, SSTAT1), &cur_col, 50);
8813 ahd_sstat2_print(ahd_inb(ahd, SSTAT2), &cur_col, 50); 8942 ahd_sstat2_print(ahd_inb(ahd, SSTAT2), &cur_col, 50);
@@ -8915,7 +9044,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
8915 9044
8916 ahd_set_modes(ahd, AHD_MODE_DFF0 + i, AHD_MODE_DFF0 + i); 9045 ahd_set_modes(ahd, AHD_MODE_DFF0 + i, AHD_MODE_DFF0 + i);
8917 fifo_scbptr = ahd_get_scbptr(ahd); 9046 fifo_scbptr = ahd_get_scbptr(ahd);
8918 printf("\n%s: FIFO%d %s, LONGJMP == 0x%x, SCB 0x%x\n", 9047 printf("\n\n%s: FIFO%d %s, LONGJMP == 0x%x, SCB 0x%x\n",
8919 ahd_name(ahd), i, 9048 ahd_name(ahd), i,
8920 (dffstat & (FIFO0FREE << i)) ? "Free" : "Active", 9049 (dffstat & (FIFO0FREE << i)) ? "Free" : "Active",
8921 ahd_inw(ahd, LONGJMP_ADDR), fifo_scbptr); 9050 ahd_inw(ahd, LONGJMP_ADDR), fifo_scbptr);
@@ -8970,6 +9099,9 @@ ahd_dump_card_state(struct ahd_softc *ahd)
8970 printf("%s: OS_SPACE_CNT = 0x%x MAXCMDCNT = 0x%x\n", 9099 printf("%s: OS_SPACE_CNT = 0x%x MAXCMDCNT = 0x%x\n",
8971 ahd_name(ahd), ahd_inb(ahd, OS_SPACE_CNT), 9100 ahd_name(ahd), ahd_inb(ahd, OS_SPACE_CNT),
8972 ahd_inb(ahd, MAXCMDCNT)); 9101 ahd_inb(ahd, MAXCMDCNT));
9102 printf("%s: SAVED_SCSIID = 0x%x SAVED_LUN = 0x%x\n",
9103 ahd_name(ahd), ahd_inb(ahd, SAVED_SCSIID),
9104 ahd_inb(ahd, SAVED_LUN));
8973 ahd_simode0_print(ahd_inb(ahd, SIMODE0), &cur_col, 50); 9105 ahd_simode0_print(ahd_inb(ahd, SIMODE0), &cur_col, 50);
8974 printf("\n"); 9106 printf("\n");
8975 ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN); 9107 ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
diff --git a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h
index 91c4f7f484b1..8ad3ce945b9e 100644
--- a/drivers/scsi/aic7xxx/aic79xx_inline.h
+++ b/drivers/scsi/aic7xxx/aic79xx_inline.h
@@ -37,7 +37,7 @@
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES. 38 * POSSIBILITY OF SUCH DAMAGES.
39 * 39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#58 $ 40 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#59 $
41 * 41 *
42 * $FreeBSD$ 42 * $FreeBSD$
43 */ 43 */
@@ -804,9 +804,10 @@ ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb)
804 uint64_t host_dataptr; 804 uint64_t host_dataptr;
805 805
806 host_dataptr = ahd_le64toh(scb->hscb->dataptr); 806 host_dataptr = ahd_le64toh(scb->hscb->dataptr);
807 printf("%s: Queueing SCB 0x%x bus addr 0x%x - 0x%x%x/0x%x\n", 807 printf("%s: Queueing SCB %d:0x%x bus addr 0x%x - 0x%x%x/0x%x\n",
808 ahd_name(ahd), 808 ahd_name(ahd),
809 SCB_GET_TAG(scb), ahd_le32toh(scb->hscb->hscb_busaddr), 809 SCB_GET_TAG(scb), scb->hscb->scsiid,
810 ahd_le32toh(scb->hscb->hscb_busaddr),
810 (u_int)((host_dataptr >> 32) & 0xFFFFFFFF), 811 (u_int)((host_dataptr >> 32) & 0xFFFFFFFF),
811 (u_int)(host_dataptr & 0xFFFFFFFF), 812 (u_int)(host_dataptr & 0xFFFFFFFF),
812 ahd_le32toh(scb->hscb->datacnt)); 813 ahd_le32toh(scb->hscb->datacnt));
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
index 2567e29960bd..7254ea535a16 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -314,6 +314,21 @@ static uint32_t aic79xx_seltime;
314 */ 314 */
315uint32_t aic79xx_periodic_otag; 315uint32_t aic79xx_periodic_otag;
316 316
317/* Some storage boxes are using an LSI chip which has a bug making it
318 * impossible to use aic79xx Rev B chip in 320 speeds. The following
319 * storage boxes have been reported to be buggy:
320 * EonStor 3U 16-Bay: U16U-G3A3
321 * EonStor 2U 12-Bay: U12U-G3A3
322 * SentinelRAID: 2500F R5 / R6
323 * SentinelRAID: 2500F R1
324 * SentinelRAID: 2500F/1500F
325 * SentinelRAID: 150F
326 *
327 * To get around this LSI bug, you can set your board to 160 mode
328 * or you can enable the SLOWCRC bit.
329 */
330uint32_t aic79xx_slowcrc;
331
317/* 332/*
318 * Module information and settable options. 333 * Module information and settable options.
319 */ 334 */
@@ -343,6 +358,7 @@ MODULE_PARM_DESC(aic79xx,
343" amplitude:<int> Set the signal amplitude (0-7).\n" 358" amplitude:<int> Set the signal amplitude (0-7).\n"
344" seltime:<int> Selection Timeout:\n" 359" seltime:<int> Selection Timeout:\n"
345" (0/256ms,1/128ms,2/64ms,3/32ms)\n" 360" (0/256ms,1/128ms,2/64ms,3/32ms)\n"
361" slowcrc Turn on the SLOWCRC bit (Rev B only)\n"
346"\n" 362"\n"
347" Sample /etc/modprobe.conf line:\n" 363" Sample /etc/modprobe.conf line:\n"
348" Enable verbose logging\n" 364" Enable verbose logging\n"
@@ -1003,6 +1019,7 @@ aic79xx_setup(char *s)
1003 { "slewrate", NULL }, 1019 { "slewrate", NULL },
1004 { "precomp", NULL }, 1020 { "precomp", NULL },
1005 { "amplitude", NULL }, 1021 { "amplitude", NULL },
1022 { "slowcrc", &aic79xx_slowcrc },
1006 }; 1023 };
1007 1024
1008 end = strchr(s, '\0'); 1025 end = strchr(s, '\0');
@@ -1072,7 +1089,6 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
1072 return (ENOMEM); 1089 return (ENOMEM);
1073 1090
1074 *((struct ahd_softc **)host->hostdata) = ahd; 1091 *((struct ahd_softc **)host->hostdata) = ahd;
1075 ahd_lock(ahd, &s);
1076 ahd->platform_data->host = host; 1092 ahd->platform_data->host = host;
1077 host->can_queue = AHD_MAX_QUEUE; 1093 host->can_queue = AHD_MAX_QUEUE;
1078 host->cmd_per_lun = 2; 1094 host->cmd_per_lun = 2;
@@ -1083,7 +1099,9 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
1083 host->max_lun = AHD_NUM_LUNS; 1099 host->max_lun = AHD_NUM_LUNS;
1084 host->max_channel = 0; 1100 host->max_channel = 0;
1085 host->sg_tablesize = AHD_NSEG; 1101 host->sg_tablesize = AHD_NSEG;
1102 ahd_lock(ahd, &s);
1086 ahd_set_unit(ahd, ahd_linux_unit++); 1103 ahd_set_unit(ahd, ahd_linux_unit++);
1104 ahd_unlock(ahd, &s);
1087 sprintf(buf, "scsi%d", host->host_no); 1105 sprintf(buf, "scsi%d", host->host_no);
1088 new_name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT); 1106 new_name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
1089 if (new_name != NULL) { 1107 if (new_name != NULL) {
@@ -1093,7 +1111,6 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
1093 host->unique_id = ahd->unit; 1111 host->unique_id = ahd->unit;
1094 ahd_linux_initialize_scsi_bus(ahd); 1112 ahd_linux_initialize_scsi_bus(ahd);
1095 ahd_intr_enable(ahd, TRUE); 1113 ahd_intr_enable(ahd, TRUE);
1096 ahd_unlock(ahd, &s);
1097 1114
1098 host->transportt = ahd_linux_transport_template; 1115 host->transportt = ahd_linux_transport_template;
1099 1116
@@ -1127,6 +1144,7 @@ ahd_linux_initialize_scsi_bus(struct ahd_softc *ahd)
1127{ 1144{
1128 u_int target_id; 1145 u_int target_id;
1129 u_int numtarg; 1146 u_int numtarg;
1147 unsigned long s;
1130 1148
1131 target_id = 0; 1149 target_id = 0;
1132 numtarg = 0; 1150 numtarg = 0;
@@ -1139,6 +1157,8 @@ ahd_linux_initialize_scsi_bus(struct ahd_softc *ahd)
1139 else 1157 else
1140 numtarg = (ahd->features & AHD_WIDE) ? 16 : 8; 1158 numtarg = (ahd->features & AHD_WIDE) ? 16 : 8;
1141 1159
1160 ahd_lock(ahd, &s);
1161
1142 /* 1162 /*
1143 * Force negotiation to async for all targets that 1163 * Force negotiation to async for all targets that
1144 * will not see an initial bus reset. 1164 * will not see an initial bus reset.
@@ -1155,16 +1175,12 @@ ahd_linux_initialize_scsi_bus(struct ahd_softc *ahd)
1155 ahd_update_neg_request(ahd, &devinfo, tstate, 1175 ahd_update_neg_request(ahd, &devinfo, tstate,
1156 tinfo, AHD_NEG_ALWAYS); 1176 tinfo, AHD_NEG_ALWAYS);
1157 } 1177 }
1178 ahd_unlock(ahd, &s);
1158 /* Give the bus some time to recover */ 1179 /* Give the bus some time to recover */
1159 if ((ahd->flags & AHD_RESET_BUS_A) != 0) { 1180 if ((ahd->flags & AHD_RESET_BUS_A) != 0) {
1160 ahd_freeze_simq(ahd); 1181 ahd_freeze_simq(ahd);
1161 init_timer(&ahd->platform_data->reset_timer); 1182 msleep(AIC79XX_RESET_DELAY);
1162 ahd->platform_data->reset_timer.data = (u_long)ahd; 1183 ahd_release_simq(ahd);
1163 ahd->platform_data->reset_timer.expires =
1164 jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
1165 ahd->platform_data->reset_timer.function =
1166 (ahd_linux_callback_t *)ahd_release_simq;
1167 add_timer(&ahd->platform_data->reset_timer);
1168 } 1184 }
1169} 1185}
1170 1186
@@ -2033,6 +2049,9 @@ ahd_linux_sem_timeout(u_long arg)
2033void 2049void
2034ahd_freeze_simq(struct ahd_softc *ahd) 2050ahd_freeze_simq(struct ahd_softc *ahd)
2035{ 2051{
2052 unsigned long s;
2053
2054 ahd_lock(ahd, &s);
2036 ahd->platform_data->qfrozen++; 2055 ahd->platform_data->qfrozen++;
2037 if (ahd->platform_data->qfrozen == 1) { 2056 if (ahd->platform_data->qfrozen == 1) {
2038 scsi_block_requests(ahd->platform_data->host); 2057 scsi_block_requests(ahd->platform_data->host);
@@ -2040,6 +2059,7 @@ ahd_freeze_simq(struct ahd_softc *ahd)
2040 CAM_LUN_WILDCARD, SCB_LIST_NULL, 2059 CAM_LUN_WILDCARD, SCB_LIST_NULL,
2041 ROLE_INITIATOR, CAM_REQUEUE_REQ); 2060 ROLE_INITIATOR, CAM_REQUEUE_REQ);
2042 } 2061 }
2062 ahd_unlock(ahd, &s);
2043} 2063}
2044 2064
2045void 2065void
@@ -2344,8 +2364,9 @@ done:
2344 ahd_name(ahd), dev->active); 2364 ahd_name(ahd), dev->active);
2345 retval = FAILED; 2365 retval = FAILED;
2346 } 2366 }
2347 } 2367 } else
2348 ahd_unlock(ahd, &flags); 2368 ahd_unlock(ahd, &flags);
2369
2349 return (retval); 2370 return (retval);
2350} 2371}
2351 2372
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
index cb74fccc8100..9cb101345107 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h
@@ -36,7 +36,7 @@
36 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGES. 37 * POSSIBILITY OF SUCH DAMAGES.
38 * 38 *
39 * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#137 $ 39 * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#166 $
40 * 40 *
41 */ 41 */
42#ifndef _AIC79XX_LINUX_H_ 42#ifndef _AIC79XX_LINUX_H_
@@ -228,7 +228,6 @@ typedef struct timer_list ahd_timer_t;
228typedef void ahd_linux_callback_t (u_long); 228typedef void ahd_linux_callback_t (u_long);
229static __inline void ahd_timer_reset(ahd_timer_t *timer, int usec, 229static __inline void ahd_timer_reset(ahd_timer_t *timer, int usec,
230 ahd_callback_t *func, void *arg); 230 ahd_callback_t *func, void *arg);
231static __inline void ahd_scb_timer_reset(struct scb *scb, u_int usec);
232 231
233static __inline void 232static __inline void
234ahd_timer_reset(ahd_timer_t *timer, int usec, ahd_callback_t *func, void *arg) 233ahd_timer_reset(ahd_timer_t *timer, int usec, ahd_callback_t *func, void *arg)
@@ -243,12 +242,6 @@ ahd_timer_reset(ahd_timer_t *timer, int usec, ahd_callback_t *func, void *arg)
243 add_timer(timer); 242 add_timer(timer);
244} 243}
245 244
246static __inline void
247ahd_scb_timer_reset(struct scb *scb, u_int usec)
248{
249 mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
250}
251
252/***************************** SMP support ************************************/ 245/***************************** SMP support ************************************/
253#include <linux/spinlock.h> 246#include <linux/spinlock.h>
254 247
@@ -389,7 +382,6 @@ struct ahd_platform_data {
389 382
390 spinlock_t spin_lock; 383 spinlock_t spin_lock;
391 u_int qfrozen; 384 u_int qfrozen;
392 struct timer_list reset_timer;
393 struct semaphore eh_sem; 385 struct semaphore eh_sem;
394 struct Scsi_Host *host; /* pointer to scsi host */ 386 struct Scsi_Host *host; /* pointer to scsi host */
395#define AHD_LINUX_NOIRQ ((uint32_t)~0) 387#define AHD_LINUX_NOIRQ ((uint32_t)~0)
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
index bf360ae021ab..ebbf7e4ff4cc 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
@@ -220,10 +220,10 @@ ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd, u_long *base,
220 *base2 = pci_resource_start(ahd->dev_softc, 3); 220 *base2 = pci_resource_start(ahd->dev_softc, 3);
221 if (*base == 0 || *base2 == 0) 221 if (*base == 0 || *base2 == 0)
222 return (ENOMEM); 222 return (ENOMEM);
223 if (request_region(*base, 256, "aic79xx") == 0) 223 if (!request_region(*base, 256, "aic79xx"))
224 return (ENOMEM); 224 return (ENOMEM);
225 if (request_region(*base2, 256, "aic79xx") == 0) { 225 if (!request_region(*base2, 256, "aic79xx")) {
226 release_region(*base2, 256); 226 release_region(*base, 256);
227 return (ENOMEM); 227 return (ENOMEM);
228 } 228 }
229 return (0); 229 return (0);
@@ -237,7 +237,7 @@ ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
237 u_long start; 237 u_long start;
238 u_long base_page; 238 u_long base_page;
239 u_long base_offset; 239 u_long base_offset;
240 int error; 240 int error = 0;
241 241
242 if (aic79xx_allow_memio == 0) 242 if (aic79xx_allow_memio == 0)
243 return (ENOMEM); 243 return (ENOMEM);
@@ -245,16 +245,15 @@ ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
245 if ((ahd->bugs & AHD_PCIX_MMAPIO_BUG) != 0) 245 if ((ahd->bugs & AHD_PCIX_MMAPIO_BUG) != 0)
246 return (ENOMEM); 246 return (ENOMEM);
247 247
248 error = 0;
249 start = pci_resource_start(ahd->dev_softc, 1); 248 start = pci_resource_start(ahd->dev_softc, 1);
250 base_page = start & PAGE_MASK; 249 base_page = start & PAGE_MASK;
251 base_offset = start - base_page; 250 base_offset = start - base_page;
252 if (start != 0) { 251 if (start != 0) {
253 *bus_addr = start; 252 *bus_addr = start;
254 if (request_mem_region(start, 0x1000, "aic79xx") == 0) 253 if (!request_mem_region(start, 0x1000, "aic79xx"))
255 error = ENOMEM; 254 error = ENOMEM;
256 if (error == 0) { 255 if (!error) {
257 *maddr = ioremap_nocache(base_page, base_offset + 256); 256 *maddr = ioremap_nocache(base_page, base_offset + 512);
258 if (*maddr == NULL) { 257 if (*maddr == NULL) {
259 error = ENOMEM; 258 error = ENOMEM;
260 release_mem_region(start, 0x1000); 259 release_mem_region(start, 0x1000);
@@ -344,7 +343,7 @@ ahd_pci_map_int(struct ahd_softc *ahd)
344 343
345 error = request_irq(ahd->dev_softc->irq, ahd_linux_isr, 344 error = request_irq(ahd->dev_softc->irq, ahd_linux_isr,
346 SA_SHIRQ, "aic79xx", ahd); 345 SA_SHIRQ, "aic79xx", ahd);
347 if (error == 0) 346 if (!error)
348 ahd->platform_data->irq = ahd->dev_softc->irq; 347 ahd->platform_data->irq = ahd->dev_softc->irq;
349 348
350 return (-error); 349 return (-error);
diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c
index 196a6344b037..757242e522c2 100644
--- a/drivers/scsi/aic7xxx/aic79xx_pci.c
+++ b/drivers/scsi/aic7xxx/aic79xx_pci.c
@@ -38,7 +38,7 @@
38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 * POSSIBILITY OF SUCH DAMAGES. 39 * POSSIBILITY OF SUCH DAMAGES.
40 * 40 *
41 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#89 $ 41 * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#92 $
42 */ 42 */
43 43
44#ifdef __linux__ 44#ifdef __linux__
@@ -950,12 +950,19 @@ ahd_aic790X_setup(struct ahd_softc *ahd)
950 if ((ahd->flags & AHD_HP_BOARD) == 0) 950 if ((ahd->flags & AHD_HP_BOARD) == 0)
951 AHD_SET_SLEWRATE(ahd, AHD_SLEWRATE_DEF_REVA); 951 AHD_SET_SLEWRATE(ahd, AHD_SLEWRATE_DEF_REVA);
952 } else { 952 } else {
953 /* This is revision B and newer. */
954 extern uint32_t aic79xx_slowcrc;
953 u_int devconfig1; 955 u_int devconfig1;
954 956
955 ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS 957 ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS
956 | AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY; 958 | AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY
959 | AHD_BUSFREEREV_BUG;
957 ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG; 960 ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG;
958 961
962 /* If the user requested the the SLOWCRC bit to be set. */
963 if (aic79xx_slowcrc)
964 ahd->features |= AHD_AIC79XXB_SLOWCRC;
965
959 /* 966 /*
960 * Some issues have been resolved in the 7901B. 967 * Some issues have been resolved in the 7901B.
961 */ 968 */
diff --git a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped
index 8763b158856b..2068e00d2c75 100644
--- a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped
+++ b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped
@@ -2,8 +2,8 @@
2 * DO NOT EDIT - This file is automatically generated 2 * DO NOT EDIT - This file is automatically generated
3 * from the following source files: 3 * from the following source files:
4 * 4 *
5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $ 5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#120 $
6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $ 6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#77 $
7 */ 7 */
8typedef int (ahd_reg_print_t)(u_int, u_int *, u_int); 8typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
9typedef struct ahd_reg_parse_entry { 9typedef struct ahd_reg_parse_entry {
@@ -2204,6 +2204,20 @@ ahd_reg_print_t ahd_cmdsize_table_print;
2204#endif 2204#endif
2205 2205
2206#if AIC_DEBUG_REGISTERS 2206#if AIC_DEBUG_REGISTERS
2207ahd_reg_print_t ahd_mk_message_scb_print;
2208#else
2209#define ahd_mk_message_scb_print(regvalue, cur_col, wrap) \
2210 ahd_print_register(NULL, 0, "MK_MESSAGE_SCB", 0x160, regvalue, cur_col, wrap)
2211#endif
2212
2213#if AIC_DEBUG_REGISTERS
2214ahd_reg_print_t ahd_mk_message_scsiid_print;
2215#else
2216#define ahd_mk_message_scsiid_print(regvalue, cur_col, wrap) \
2217 ahd_print_register(NULL, 0, "MK_MESSAGE_SCSIID", 0x162, regvalue, cur_col, wrap)
2218#endif
2219
2220#if AIC_DEBUG_REGISTERS
2207ahd_reg_print_t ahd_scb_base_print; 2221ahd_reg_print_t ahd_scb_base_print;
2208#else 2222#else
2209#define ahd_scb_base_print(regvalue, cur_col, wrap) \ 2223#define ahd_scb_base_print(regvalue, cur_col, wrap) \
@@ -3638,6 +3652,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
3638#define SEQ_FLAGS2 0x14d 3652#define SEQ_FLAGS2 0x14d
3639#define SELECTOUT_QFROZEN 0x04 3653#define SELECTOUT_QFROZEN 0x04
3640#define TARGET_MSG_PENDING 0x02 3654#define TARGET_MSG_PENDING 0x02
3655#define PENDING_MK_MESSAGE 0x01
3641 3656
3642#define ALLOCFIFO_SCBPTR 0x14e 3657#define ALLOCFIFO_SCBPTR 0x14e
3643 3658
@@ -3655,6 +3670,10 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
3655 3670
3656#define CMDSIZE_TABLE 0x158 3671#define CMDSIZE_TABLE 0x158
3657 3672
3673#define MK_MESSAGE_SCB 0x160
3674
3675#define MK_MESSAGE_SCSIID 0x162
3676
3658#define SCB_BASE 0x180 3677#define SCB_BASE 0x180
3659 3678
3660#define SCB_RESIDUAL_DATACNT 0x180 3679#define SCB_RESIDUAL_DATACNT 0x180
@@ -3800,5 +3819,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
3800 3819
3801 3820
3802/* Exported Labels */ 3821/* Exported Labels */
3803#define LABEL_seq_isr 0x285 3822#define LABEL_seq_isr 0x28f
3804#define LABEL_timer_isr 0x281 3823#define LABEL_timer_isr 0x28b
diff --git a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped
index a4137c985376..db38a61a8cb4 100644
--- a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped
+++ b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped
@@ -2,8 +2,8 @@
2 * DO NOT EDIT - This file is automatically generated 2 * DO NOT EDIT - This file is automatically generated
3 * from the following source files: 3 * from the following source files:
4 * 4 *
5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#118 $ 5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#120 $
6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#75 $ 6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#77 $
7 */ 7 */
8 8
9#include "aic79xx_osm.h" 9#include "aic79xx_osm.h"
@@ -3382,6 +3382,7 @@ ahd_initiator_tag_print(u_int regvalue, u_int *cur_col, u_int wrap)
3382} 3382}
3383 3383
3384static ahd_reg_parse_entry_t SEQ_FLAGS2_parse_table[] = { 3384static ahd_reg_parse_entry_t SEQ_FLAGS2_parse_table[] = {
3385 { "PENDING_MK_MESSAGE", 0x01, 0x01 },
3385 { "TARGET_MSG_PENDING", 0x02, 0x02 }, 3386 { "TARGET_MSG_PENDING", 0x02, 0x02 },
3386 { "SELECTOUT_QFROZEN", 0x04, 0x04 } 3387 { "SELECTOUT_QFROZEN", 0x04, 0x04 }
3387}; 3388};
@@ -3389,7 +3390,7 @@ static ahd_reg_parse_entry_t SEQ_FLAGS2_parse_table[] = {
3389int 3390int
3390ahd_seq_flags2_print(u_int regvalue, u_int *cur_col, u_int wrap) 3391ahd_seq_flags2_print(u_int regvalue, u_int *cur_col, u_int wrap)
3391{ 3392{
3392 return (ahd_print_register(SEQ_FLAGS2_parse_table, 2, "SEQ_FLAGS2", 3393 return (ahd_print_register(SEQ_FLAGS2_parse_table, 3, "SEQ_FLAGS2",
3393 0x14d, regvalue, cur_col, wrap)); 3394 0x14d, regvalue, cur_col, wrap));
3394} 3395}
3395 3396
@@ -3450,6 +3451,20 @@ ahd_cmdsize_table_print(u_int regvalue, u_int *cur_col, u_int wrap)
3450} 3451}
3451 3452
3452int 3453int
3454ahd_mk_message_scb_print(u_int regvalue, u_int *cur_col, u_int wrap)
3455{
3456 return (ahd_print_register(NULL, 0, "MK_MESSAGE_SCB",
3457 0x160, regvalue, cur_col, wrap));
3458}
3459
3460int
3461ahd_mk_message_scsiid_print(u_int regvalue, u_int *cur_col, u_int wrap)
3462{
3463 return (ahd_print_register(NULL, 0, "MK_MESSAGE_SCSIID",
3464 0x162, regvalue, cur_col, wrap));
3465}
3466
3467int
3453ahd_scb_base_print(u_int regvalue, u_int *cur_col, u_int wrap) 3468ahd_scb_base_print(u_int regvalue, u_int *cur_col, u_int wrap)
3454{ 3469{
3455 return (ahd_print_register(NULL, 0, "SCB_BASE", 3470 return (ahd_print_register(NULL, 0, "SCB_BASE",
diff --git a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped
index b1e5365be230..11bed07e90b7 100644
--- a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped
+++ b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped
@@ -2,17 +2,17 @@
2 * DO NOT EDIT - This file is automatically generated 2 * DO NOT EDIT - This file is automatically generated
3 * from the following source files: 3 * from the following source files:
4 * 4 *
5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $ 5 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#120 $
6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $ 6 * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#77 $
7 */ 7 */
8static uint8_t seqprog[] = { 8static uint8_t seqprog[] = {
9 0xff, 0x02, 0x06, 0x78, 9 0xff, 0x02, 0x06, 0x78,
10 0x00, 0xea, 0x64, 0x59, 10 0x00, 0xea, 0x6e, 0x59,
11 0x01, 0xea, 0x04, 0x30, 11 0x01, 0xea, 0x04, 0x30,
12 0xff, 0x04, 0x0c, 0x78, 12 0xff, 0x04, 0x0c, 0x78,
13 0x19, 0xea, 0x64, 0x59, 13 0x19, 0xea, 0x6e, 0x59,
14 0x19, 0xea, 0x04, 0x00, 14 0x19, 0xea, 0x04, 0x00,
15 0x33, 0xea, 0x5e, 0x59, 15 0x33, 0xea, 0x68, 0x59,
16 0x33, 0xea, 0x00, 0x00, 16 0x33, 0xea, 0x00, 0x00,
17 0x60, 0x3a, 0x3a, 0x68, 17 0x60, 0x3a, 0x3a, 0x68,
18 0x04, 0x4d, 0x35, 0x78, 18 0x04, 0x4d, 0x35, 0x78,
@@ -33,15 +33,15 @@ static uint8_t seqprog[] = {
33 0xff, 0xea, 0x62, 0x02, 33 0xff, 0xea, 0x62, 0x02,
34 0x00, 0xe2, 0x3a, 0x40, 34 0x00, 0xe2, 0x3a, 0x40,
35 0xff, 0x21, 0x3b, 0x70, 35 0xff, 0x21, 0x3b, 0x70,
36 0x40, 0x4b, 0xaa, 0x69, 36 0x40, 0x4b, 0xb4, 0x69,
37 0x00, 0xe2, 0x68, 0x59, 37 0x00, 0xe2, 0x72, 0x59,
38 0x40, 0x4b, 0xaa, 0x69, 38 0x40, 0x4b, 0xb4, 0x69,
39 0x20, 0x4b, 0x96, 0x69, 39 0x20, 0x4b, 0xa0, 0x69,
40 0xfc, 0x42, 0x44, 0x78, 40 0xfc, 0x42, 0x44, 0x78,
41 0x10, 0x40, 0x44, 0x78, 41 0x10, 0x40, 0x44, 0x78,
42 0x00, 0xe2, 0xfc, 0x5d, 42 0x00, 0xe2, 0x10, 0x5e,
43 0x20, 0x4d, 0x48, 0x78, 43 0x20, 0x4d, 0x48, 0x78,
44 0x00, 0xe2, 0xfc, 0x5d, 44 0x00, 0xe2, 0x10, 0x5e,
45 0x30, 0x3f, 0xc0, 0x09, 45 0x30, 0x3f, 0xc0, 0x09,
46 0x30, 0xe0, 0x50, 0x60, 46 0x30, 0xe0, 0x50, 0x60,
47 0x7f, 0x4a, 0x94, 0x08, 47 0x7f, 0x4a, 0x94, 0x08,
@@ -51,7 +51,7 @@ static uint8_t seqprog[] = {
51 0x00, 0xe2, 0x76, 0x58, 51 0x00, 0xe2, 0x76, 0x58,
52 0x00, 0xe2, 0x86, 0x58, 52 0x00, 0xe2, 0x86, 0x58,
53 0x00, 0xe2, 0x06, 0x40, 53 0x00, 0xe2, 0x06, 0x40,
54 0x33, 0xea, 0x5e, 0x59, 54 0x33, 0xea, 0x68, 0x59,
55 0x33, 0xea, 0x00, 0x00, 55 0x33, 0xea, 0x00, 0x00,
56 0x01, 0x52, 0x84, 0x78, 56 0x01, 0x52, 0x84, 0x78,
57 0x02, 0x58, 0x50, 0x31, 57 0x02, 0x58, 0x50, 0x31,
@@ -59,26 +59,26 @@ static uint8_t seqprog[] = {
59 0xff, 0x97, 0x6f, 0x78, 59 0xff, 0x97, 0x6f, 0x78,
60 0x50, 0x4b, 0x6a, 0x68, 60 0x50, 0x4b, 0x6a, 0x68,
61 0xbf, 0x3a, 0x74, 0x08, 61 0xbf, 0x3a, 0x74, 0x08,
62 0x14, 0xea, 0x64, 0x59, 62 0x14, 0xea, 0x6e, 0x59,
63 0x14, 0xea, 0x04, 0x00, 63 0x14, 0xea, 0x04, 0x00,
64 0x08, 0x92, 0x25, 0x03, 64 0x08, 0x92, 0x25, 0x03,
65 0xff, 0x90, 0x5f, 0x68, 65 0xff, 0x90, 0x5f, 0x68,
66 0x00, 0xe2, 0x76, 0x5b, 66 0x00, 0xe2, 0x8a, 0x5b,
67 0x00, 0xe2, 0x5e, 0x40, 67 0x00, 0xe2, 0x5e, 0x40,
68 0x00, 0xea, 0x5e, 0x59, 68 0x00, 0xea, 0x68, 0x59,
69 0x01, 0xea, 0x00, 0x30, 69 0x01, 0xea, 0x00, 0x30,
70 0x80, 0xf9, 0x7e, 0x68, 70 0x80, 0xf9, 0x7e, 0x68,
71 0x00, 0xe2, 0x5c, 0x59, 71 0x00, 0xe2, 0x66, 0x59,
72 0x11, 0xea, 0x5e, 0x59, 72 0x11, 0xea, 0x68, 0x59,
73 0x11, 0xea, 0x00, 0x00, 73 0x11, 0xea, 0x00, 0x00,
74 0x80, 0xf9, 0x5c, 0x79, 74 0x80, 0xf9, 0x66, 0x79,
75 0xff, 0xea, 0xd4, 0x0d, 75 0xff, 0xea, 0xd4, 0x0d,
76 0x22, 0xea, 0x5e, 0x59, 76 0x22, 0xea, 0x68, 0x59,
77 0x22, 0xea, 0x00, 0x00, 77 0x22, 0xea, 0x00, 0x00,
78 0x10, 0x16, 0x90, 0x78, 78 0x10, 0x16, 0x90, 0x78,
79 0x10, 0x16, 0x2c, 0x00, 79 0x10, 0x16, 0x2c, 0x00,
80 0x01, 0x0b, 0xae, 0x32, 80 0x01, 0x0b, 0xae, 0x32,
81 0x18, 0xad, 0x12, 0x79, 81 0x18, 0xad, 0x1c, 0x79,
82 0x04, 0xad, 0xdc, 0x68, 82 0x04, 0xad, 0xdc, 0x68,
83 0x80, 0xad, 0x84, 0x78, 83 0x80, 0xad, 0x84, 0x78,
84 0x10, 0xad, 0xaa, 0x78, 84 0x10, 0xad, 0xaa, 0x78,
@@ -118,7 +118,6 @@ static uint8_t seqprog[] = {
118 0x80, 0x18, 0x30, 0x04, 118 0x80, 0x18, 0x30, 0x04,
119 0x40, 0xad, 0x84, 0x78, 119 0x40, 0xad, 0x84, 0x78,
120 0xe7, 0xad, 0x5a, 0x09, 120 0xe7, 0xad, 0x5a, 0x09,
121 0x02, 0xa8, 0x40, 0x31,
122 0xff, 0xea, 0xc0, 0x09, 121 0xff, 0xea, 0xc0, 0x09,
123 0x01, 0x54, 0xa9, 0x1a, 122 0x01, 0x54, 0xa9, 0x1a,
124 0x00, 0x55, 0xab, 0x22, 123 0x00, 0x55, 0xab, 0x22,
@@ -128,24 +127,30 @@ static uint8_t seqprog[] = {
128 0xff, 0xea, 0x5a, 0x03, 127 0xff, 0xea, 0x5a, 0x03,
129 0xff, 0xea, 0x5e, 0x03, 128 0xff, 0xea, 0x5e, 0x03,
130 0x01, 0x10, 0xd4, 0x31, 129 0x01, 0x10, 0xd4, 0x31,
131 0x10, 0x92, 0x07, 0x69, 130 0x02, 0xa8, 0x40, 0x31,
131 0x01, 0x92, 0xc1, 0x31,
132 0x3d, 0x93, 0xc5, 0x29, 132 0x3d, 0x93, 0xc5, 0x29,
133 0xfe, 0xe2, 0xc4, 0x09, 133 0xfe, 0xe2, 0xc4, 0x09,
134 0x01, 0xea, 0xc6, 0x01, 134 0x01, 0xea, 0xc6, 0x01,
135 0x02, 0xe2, 0xc8, 0x31, 135 0x02, 0xe2, 0xc8, 0x31,
136 0x02, 0xec, 0x50, 0x31, 136 0x02, 0xec, 0x50, 0x31,
137 0x02, 0xa0, 0xda, 0x31, 137 0x02, 0xa0, 0xda, 0x31,
138 0xff, 0xa9, 0x06, 0x71, 138 0xff, 0xa9, 0x10, 0x71,
139 0x10, 0xe0, 0x0e, 0x79,
140 0x10, 0x92, 0x0f, 0x79,
141 0x01, 0x4d, 0x9b, 0x02,
142 0x02, 0xa0, 0xc0, 0x32,
143 0x01, 0x93, 0xc5, 0x36,
139 0x02, 0xa0, 0x58, 0x37, 144 0x02, 0xa0, 0x58, 0x37,
140 0xff, 0x21, 0x0f, 0x71, 145 0xff, 0x21, 0x19, 0x71,
141 0x02, 0x22, 0x51, 0x31, 146 0x02, 0x22, 0x51, 0x31,
142 0x02, 0xa0, 0x5c, 0x33, 147 0x02, 0xa0, 0x5c, 0x33,
143 0x02, 0xa0, 0x44, 0x36, 148 0x02, 0xa0, 0x44, 0x36,
144 0x02, 0xa0, 0x40, 0x32, 149 0x02, 0xa0, 0x40, 0x32,
145 0x02, 0xa0, 0x44, 0x36, 150 0x02, 0xa0, 0x44, 0x36,
146 0x04, 0x4d, 0x17, 0x69, 151 0x05, 0x4d, 0x21, 0x69,
147 0x40, 0x16, 0x48, 0x69, 152 0x40, 0x16, 0x52, 0x69,
148 0xff, 0x2d, 0x4d, 0x61, 153 0xff, 0x2d, 0x57, 0x61,
149 0xff, 0x29, 0x85, 0x70, 154 0xff, 0x29, 0x85, 0x70,
150 0x02, 0x28, 0x55, 0x32, 155 0x02, 0x28, 0x55, 0x32,
151 0x01, 0xea, 0x5a, 0x01, 156 0x01, 0xea, 0x5a, 0x01,
@@ -159,22 +164,22 @@ static uint8_t seqprog[] = {
159 0x01, 0x56, 0xad, 0x1a, 164 0x01, 0x56, 0xad, 0x1a,
160 0xff, 0x54, 0xa9, 0x1a, 165 0xff, 0x54, 0xa9, 0x1a,
161 0xff, 0x55, 0xab, 0x22, 166 0xff, 0x55, 0xab, 0x22,
162 0xff, 0x8d, 0x41, 0x71, 167 0xff, 0x8d, 0x4b, 0x71,
163 0x80, 0xac, 0x40, 0x71, 168 0x80, 0xac, 0x4a, 0x71,
164 0x20, 0x16, 0x40, 0x69, 169 0x20, 0x16, 0x4a, 0x69,
165 0x00, 0xac, 0xc4, 0x19, 170 0x00, 0xac, 0xc4, 0x19,
166 0x07, 0xe2, 0x40, 0xf9, 171 0x07, 0xe2, 0x4a, 0xf9,
167 0x02, 0x8c, 0x51, 0x31, 172 0x02, 0x8c, 0x51, 0x31,
168 0x00, 0xe2, 0x24, 0x41, 173 0x00, 0xe2, 0x2e, 0x41,
169 0x01, 0xac, 0x08, 0x31, 174 0x01, 0xac, 0x08, 0x31,
170 0x09, 0xea, 0x5a, 0x01, 175 0x09, 0xea, 0x5a, 0x01,
171 0x02, 0x8c, 0x51, 0x32, 176 0x02, 0x8c, 0x51, 0x32,
172 0xff, 0xea, 0x1a, 0x07, 177 0xff, 0xea, 0x1a, 0x07,
173 0x04, 0x24, 0xf9, 0x30, 178 0x04, 0x24, 0xf9, 0x30,
174 0x1d, 0xea, 0x52, 0x41, 179 0x1d, 0xea, 0x5c, 0x41,
175 0x02, 0x2c, 0x51, 0x31, 180 0x02, 0x2c, 0x51, 0x31,
176 0x04, 0xa8, 0xf9, 0x30, 181 0x04, 0xa8, 0xf9, 0x30,
177 0x19, 0xea, 0x52, 0x41, 182 0x19, 0xea, 0x5c, 0x41,
178 0x06, 0xea, 0x08, 0x81, 183 0x06, 0xea, 0x08, 0x81,
179 0x01, 0xe2, 0x5a, 0x35, 184 0x01, 0xe2, 0x5a, 0x35,
180 0x02, 0xf2, 0xf0, 0x31, 185 0x02, 0xf2, 0xf0, 0x31,
@@ -190,27 +195,27 @@ static uint8_t seqprog[] = {
190 0x02, 0x20, 0xb9, 0x30, 195 0x02, 0x20, 0xb9, 0x30,
191 0x02, 0x20, 0x51, 0x31, 196 0x02, 0x20, 0x51, 0x31,
192 0x4c, 0x93, 0xd7, 0x28, 197 0x4c, 0x93, 0xd7, 0x28,
193 0x10, 0x92, 0x77, 0x79, 198 0x10, 0x92, 0x81, 0x79,
194 0x01, 0x6b, 0xc0, 0x30, 199 0x01, 0x6b, 0xc0, 0x30,
195 0x02, 0x64, 0xc8, 0x00, 200 0x02, 0x64, 0xc8, 0x00,
196 0x40, 0x3a, 0x74, 0x04, 201 0x40, 0x3a, 0x74, 0x04,
197 0x00, 0xe2, 0x76, 0x58, 202 0x00, 0xe2, 0x76, 0x58,
198 0x33, 0xea, 0x5e, 0x59, 203 0x33, 0xea, 0x68, 0x59,
199 0x33, 0xea, 0x00, 0x00, 204 0x33, 0xea, 0x00, 0x00,
200 0x30, 0x3f, 0xc0, 0x09, 205 0x30, 0x3f, 0xc0, 0x09,
201 0x30, 0xe0, 0x78, 0x61, 206 0x30, 0xe0, 0x82, 0x61,
202 0x20, 0x3f, 0x8e, 0x69, 207 0x20, 0x3f, 0x98, 0x69,
203 0x10, 0x3f, 0x78, 0x79, 208 0x10, 0x3f, 0x82, 0x79,
204 0x02, 0xea, 0x7e, 0x00, 209 0x02, 0xea, 0x7e, 0x00,
205 0x00, 0xea, 0x5e, 0x59, 210 0x00, 0xea, 0x68, 0x59,
206 0x01, 0xea, 0x00, 0x30, 211 0x01, 0xea, 0x00, 0x30,
207 0x02, 0x4e, 0x51, 0x35, 212 0x02, 0x4e, 0x51, 0x35,
208 0x01, 0xea, 0x7e, 0x00, 213 0x01, 0xea, 0x7e, 0x00,
209 0x11, 0xea, 0x5e, 0x59, 214 0x11, 0xea, 0x68, 0x59,
210 0x11, 0xea, 0x00, 0x00, 215 0x11, 0xea, 0x00, 0x00,
211 0x02, 0x4e, 0x51, 0x35, 216 0x02, 0x4e, 0x51, 0x35,
212 0xc0, 0x4a, 0x94, 0x00, 217 0xc0, 0x4a, 0x94, 0x00,
213 0x04, 0x41, 0x9c, 0x79, 218 0x04, 0x41, 0xa6, 0x79,
214 0x08, 0xea, 0x98, 0x00, 219 0x08, 0xea, 0x98, 0x00,
215 0x08, 0x57, 0xae, 0x00, 220 0x08, 0x57, 0xae, 0x00,
216 0x08, 0x3c, 0x78, 0x00, 221 0x08, 0x3c, 0x78, 0x00,
@@ -218,12 +223,12 @@ static uint8_t seqprog[] = {
218 0x0f, 0x67, 0xc0, 0x09, 223 0x0f, 0x67, 0xc0, 0x09,
219 0x00, 0x3a, 0x75, 0x02, 224 0x00, 0x3a, 0x75, 0x02,
220 0x20, 0xea, 0x96, 0x00, 225 0x20, 0xea, 0x96, 0x00,
221 0x00, 0xe2, 0x14, 0x42, 226 0x00, 0xe2, 0x28, 0x42,
222 0xc0, 0x4a, 0x94, 0x00, 227 0xc0, 0x4a, 0x94, 0x00,
223 0x40, 0x3a, 0xc8, 0x69, 228 0x40, 0x3a, 0xd2, 0x69,
224 0x02, 0x55, 0x06, 0x68, 229 0x02, 0x55, 0x06, 0x68,
225 0x02, 0x56, 0xc8, 0x69, 230 0x02, 0x56, 0xd2, 0x69,
226 0xff, 0x5b, 0xc8, 0x61, 231 0xff, 0x5b, 0xd2, 0x61,
227 0x02, 0x20, 0x51, 0x31, 232 0x02, 0x20, 0x51, 0x31,
228 0x80, 0xea, 0xb2, 0x01, 233 0x80, 0xea, 0xb2, 0x01,
229 0x44, 0xea, 0x00, 0x00, 234 0x44, 0xea, 0x00, 0x00,
@@ -231,40 +236,45 @@ static uint8_t seqprog[] = {
231 0x33, 0xea, 0x00, 0x00, 236 0x33, 0xea, 0x00, 0x00,
232 0xff, 0xea, 0xb2, 0x09, 237 0xff, 0xea, 0xb2, 0x09,
233 0xff, 0xe0, 0xc0, 0x19, 238 0xff, 0xe0, 0xc0, 0x19,
234 0xff, 0xe0, 0xca, 0x79, 239 0xff, 0xe0, 0xd4, 0x79,
235 0x02, 0xac, 0x51, 0x31, 240 0x02, 0xac, 0x51, 0x31,
236 0x00, 0xe2, 0xc0, 0x41, 241 0x00, 0xe2, 0xca, 0x41,
237 0x02, 0x5e, 0x50, 0x31, 242 0x02, 0x5e, 0x50, 0x31,
238 0x02, 0xa8, 0xb8, 0x30, 243 0x02, 0xa8, 0xb8, 0x30,
239 0x02, 0x5c, 0x50, 0x31, 244 0x02, 0x5c, 0x50, 0x31,
240 0xff, 0xad, 0xdb, 0x71, 245 0xff, 0xad, 0xe5, 0x71,
241 0x02, 0xac, 0x41, 0x31, 246 0x02, 0xac, 0x41, 0x31,
242 0x02, 0x22, 0x51, 0x31, 247 0x02, 0x22, 0x51, 0x31,
243 0x02, 0xa0, 0x5c, 0x33, 248 0x02, 0xa0, 0x5c, 0x33,
244 0x02, 0xa0, 0x44, 0x32, 249 0x02, 0xa0, 0x44, 0x32,
245 0x00, 0xe2, 0xe4, 0x41, 250 0x00, 0xe2, 0xf8, 0x41,
246 0x10, 0x92, 0xe5, 0x69, 251 0x01, 0x4d, 0xf1, 0x79,
252 0x01, 0x62, 0xc1, 0x31,
253 0x00, 0x93, 0xf1, 0x61,
254 0xfe, 0x4d, 0x9b, 0x0a,
255 0x02, 0x60, 0x41, 0x31,
256 0x00, 0xe2, 0xdc, 0x41,
247 0x3d, 0x93, 0xc9, 0x29, 257 0x3d, 0x93, 0xc9, 0x29,
248 0x01, 0xe4, 0xc8, 0x01, 258 0x01, 0xe4, 0xc8, 0x01,
249 0x01, 0xea, 0xca, 0x01, 259 0x01, 0xea, 0xca, 0x01,
250 0xff, 0xea, 0xda, 0x01, 260 0xff, 0xea, 0xda, 0x01,
251 0x02, 0x20, 0x51, 0x31, 261 0x02, 0x20, 0x51, 0x31,
252 0x02, 0xae, 0x41, 0x32, 262 0x02, 0xae, 0x41, 0x32,
253 0xff, 0x21, 0xed, 0x61, 263 0xff, 0x21, 0x01, 0x62,
254 0xff, 0xea, 0x46, 0x02, 264 0xff, 0xea, 0x46, 0x02,
255 0x02, 0x5c, 0x50, 0x31, 265 0x02, 0x5c, 0x50, 0x31,
256 0x40, 0xea, 0x96, 0x00, 266 0x40, 0xea, 0x96, 0x00,
257 0x02, 0x56, 0x04, 0x6e, 267 0x02, 0x56, 0x20, 0x6e,
258 0x01, 0x55, 0x04, 0x6e, 268 0x01, 0x55, 0x20, 0x6e,
259 0x10, 0x92, 0xf9, 0x79, 269 0x10, 0x92, 0x0d, 0x7a,
260 0x10, 0x40, 0x02, 0x6a, 270 0x10, 0x40, 0x16, 0x6a,
261 0x01, 0x56, 0x02, 0x7a, 271 0x01, 0x56, 0x16, 0x7a,
262 0xff, 0x97, 0x07, 0x78, 272 0xff, 0x97, 0x07, 0x78,
263 0x13, 0xea, 0x64, 0x59, 273 0x13, 0xea, 0x6e, 0x59,
264 0x13, 0xea, 0x04, 0x00, 274 0x13, 0xea, 0x04, 0x00,
265 0x00, 0xe2, 0x06, 0x40, 275 0x00, 0xe2, 0x06, 0x40,
266 0xbf, 0x3a, 0x74, 0x08, 276 0xbf, 0x3a, 0x74, 0x08,
267 0x04, 0x41, 0x08, 0x7a, 277 0x04, 0x41, 0x1c, 0x7a,
268 0x08, 0xea, 0x98, 0x00, 278 0x08, 0xea, 0x98, 0x00,
269 0x08, 0x57, 0xae, 0x00, 279 0x08, 0x57, 0xae, 0x00,
270 0x01, 0x93, 0x75, 0x32, 280 0x01, 0x93, 0x75, 0x32,
@@ -272,108 +282,108 @@ static uint8_t seqprog[] = {
272 0x40, 0xea, 0x72, 0x02, 282 0x40, 0xea, 0x72, 0x02,
273 0x08, 0x3c, 0x78, 0x00, 283 0x08, 0x3c, 0x78, 0x00,
274 0x80, 0xea, 0x6e, 0x02, 284 0x80, 0xea, 0x6e, 0x02,
275 0x00, 0xe2, 0xe2, 0x5b, 285 0x00, 0xe2, 0xf6, 0x5b,
276 0x01, 0x3c, 0xc1, 0x31, 286 0x01, 0x3c, 0xc1, 0x31,
277 0x9f, 0xe0, 0x84, 0x7c, 287 0x9f, 0xe0, 0x98, 0x7c,
278 0x80, 0xe0, 0x28, 0x72, 288 0x80, 0xe0, 0x3c, 0x72,
279 0xa0, 0xe0, 0x64, 0x72, 289 0xa0, 0xe0, 0x78, 0x72,
280 0xc0, 0xe0, 0x5a, 0x72, 290 0xc0, 0xe0, 0x6e, 0x72,
281 0xe0, 0xe0, 0x94, 0x72, 291 0xe0, 0xe0, 0xa8, 0x72,
282 0x01, 0xea, 0x64, 0x59, 292 0x01, 0xea, 0x6e, 0x59,
283 0x01, 0xea, 0x04, 0x00, 293 0x01, 0xea, 0x04, 0x00,
284 0x00, 0xe2, 0x14, 0x42, 294 0x00, 0xe2, 0x28, 0x42,
285 0x80, 0x39, 0x2f, 0x7a, 295 0x80, 0x39, 0x43, 0x7a,
286 0x03, 0xea, 0x64, 0x59, 296 0x03, 0xea, 0x6e, 0x59,
287 0x03, 0xea, 0x04, 0x00, 297 0x03, 0xea, 0x04, 0x00,
288 0xee, 0x00, 0x36, 0x6a, 298 0xee, 0x00, 0x4a, 0x6a,
289 0x05, 0xea, 0xb4, 0x00, 299 0x05, 0xea, 0xb4, 0x00,
290 0x33, 0xea, 0x5e, 0x59, 300 0x33, 0xea, 0x68, 0x59,
291 0x33, 0xea, 0x00, 0x00, 301 0x33, 0xea, 0x00, 0x00,
292 0x02, 0xa8, 0x9c, 0x32, 302 0x02, 0xa8, 0x9c, 0x32,
293 0x00, 0xe2, 0x7e, 0x59, 303 0x00, 0xe2, 0x88, 0x59,
294 0xef, 0x96, 0xd5, 0x19, 304 0xef, 0x96, 0xd5, 0x19,
295 0x00, 0xe2, 0x46, 0x52, 305 0x00, 0xe2, 0x5a, 0x52,
296 0x09, 0x80, 0xe1, 0x30, 306 0x09, 0x80, 0xe1, 0x30,
297 0x02, 0xea, 0x36, 0x00, 307 0x02, 0xea, 0x36, 0x00,
298 0xa8, 0xea, 0x32, 0x00, 308 0xa8, 0xea, 0x32, 0x00,
299 0x00, 0xe2, 0x4c, 0x42, 309 0x00, 0xe2, 0x60, 0x42,
300 0x01, 0x96, 0xd1, 0x30, 310 0x01, 0x96, 0xd1, 0x30,
301 0x10, 0x80, 0x89, 0x31, 311 0x10, 0x80, 0x89, 0x31,
302 0x20, 0xea, 0x32, 0x00, 312 0x20, 0xea, 0x32, 0x00,
303 0xbf, 0x39, 0x73, 0x0a, 313 0xbf, 0x39, 0x73, 0x0a,
304 0x10, 0x4c, 0x56, 0x6a, 314 0x10, 0x4c, 0x6a, 0x6a,
305 0x20, 0x19, 0x4e, 0x6a, 315 0x20, 0x19, 0x62, 0x6a,
306 0x20, 0x19, 0x52, 0x6a, 316 0x20, 0x19, 0x66, 0x6a,
307 0x02, 0x4d, 0x14, 0x6a, 317 0x02, 0x4d, 0x28, 0x6a,
308 0x40, 0x39, 0x73, 0x02, 318 0x40, 0x39, 0x73, 0x02,
309 0x00, 0xe2, 0x14, 0x42, 319 0x00, 0xe2, 0x28, 0x42,
310 0x80, 0x39, 0xd5, 0x6a, 320 0x80, 0x39, 0xe9, 0x6a,
311 0x01, 0x44, 0x10, 0x33, 321 0x01, 0x44, 0x10, 0x33,
312 0x08, 0x92, 0x25, 0x03, 322 0x08, 0x92, 0x25, 0x03,
313 0x00, 0xe2, 0x14, 0x42, 323 0x00, 0xe2, 0x28, 0x42,
314 0x10, 0xea, 0x80, 0x00, 324 0x10, 0xea, 0x80, 0x00,
315 0x01, 0x37, 0xc5, 0x31, 325 0x01, 0x37, 0xc5, 0x31,
316 0x80, 0xe2, 0x80, 0x62, 326 0x80, 0xe2, 0x94, 0x62,
317 0x10, 0x92, 0xa5, 0x6a, 327 0x10, 0x92, 0xb9, 0x6a,
318 0xc0, 0x94, 0xc5, 0x01, 328 0xc0, 0x94, 0xc5, 0x01,
319 0x40, 0x92, 0x71, 0x6a, 329 0x40, 0x92, 0x85, 0x6a,
320 0xbf, 0xe2, 0xc4, 0x09, 330 0xbf, 0xe2, 0xc4, 0x09,
321 0x20, 0x92, 0x85, 0x7a, 331 0x20, 0x92, 0x99, 0x7a,
322 0x01, 0xe2, 0x88, 0x30, 332 0x01, 0xe2, 0x88, 0x30,
323 0x00, 0xe2, 0xe2, 0x5b, 333 0x00, 0xe2, 0xf6, 0x5b,
324 0xa0, 0x3c, 0x8d, 0x62, 334 0xa0, 0x3c, 0xa1, 0x62,
325 0x23, 0x92, 0x89, 0x08, 335 0x23, 0x92, 0x89, 0x08,
326 0x00, 0xe2, 0xe2, 0x5b, 336 0x00, 0xe2, 0xf6, 0x5b,
327 0xa0, 0x3c, 0x8d, 0x62, 337 0xa0, 0x3c, 0xa1, 0x62,
328 0x00, 0xa8, 0x84, 0x42, 338 0x00, 0xa8, 0x98, 0x42,
329 0xff, 0xe2, 0x84, 0x62, 339 0xff, 0xe2, 0x98, 0x62,
330 0x00, 0xe2, 0xa4, 0x42, 340 0x00, 0xe2, 0xb8, 0x42,
331 0x40, 0xea, 0x98, 0x00, 341 0x40, 0xea, 0x98, 0x00,
332 0x01, 0xe2, 0x88, 0x30, 342 0x01, 0xe2, 0x88, 0x30,
333 0x00, 0xe2, 0xe2, 0x5b, 343 0x00, 0xe2, 0xf6, 0x5b,
334 0xa0, 0x3c, 0x63, 0x72, 344 0xa0, 0x3c, 0x77, 0x72,
335 0x40, 0xea, 0x98, 0x00, 345 0x40, 0xea, 0x98, 0x00,
336 0x01, 0x37, 0x95, 0x32, 346 0x01, 0x37, 0x95, 0x32,
337 0x08, 0xea, 0x6e, 0x02, 347 0x08, 0xea, 0x6e, 0x02,
338 0x00, 0xe2, 0x14, 0x42, 348 0x00, 0xe2, 0x28, 0x42,
339 0xe0, 0xea, 0xfe, 0x5b, 349 0xe0, 0xea, 0x12, 0x5c,
340 0x80, 0xe0, 0xe0, 0x6a, 350 0x80, 0xe0, 0xf4, 0x6a,
341 0x04, 0xe0, 0x92, 0x73, 351 0x04, 0xe0, 0xa6, 0x73,
342 0x02, 0xe0, 0xc4, 0x73, 352 0x02, 0xe0, 0xd8, 0x73,
343 0x00, 0xea, 0x3e, 0x73, 353 0x00, 0xea, 0x52, 0x73,
344 0x03, 0xe0, 0xd4, 0x73, 354 0x03, 0xe0, 0xe8, 0x73,
345 0x23, 0xe0, 0xb6, 0x72, 355 0x23, 0xe0, 0xca, 0x72,
346 0x08, 0xe0, 0xdc, 0x72, 356 0x08, 0xe0, 0xf0, 0x72,
347 0x00, 0xe2, 0xe2, 0x5b, 357 0x00, 0xe2, 0xf6, 0x5b,
348 0x07, 0xea, 0x64, 0x59, 358 0x07, 0xea, 0x6e, 0x59,
349 0x07, 0xea, 0x04, 0x00, 359 0x07, 0xea, 0x04, 0x00,
350 0x08, 0x48, 0x15, 0x72, 360 0x08, 0x48, 0x29, 0x72,
351 0x04, 0x48, 0xb3, 0x62, 361 0x04, 0x48, 0xc7, 0x62,
352 0x01, 0x49, 0x89, 0x30, 362 0x01, 0x49, 0x89, 0x30,
353 0x00, 0xe2, 0xa4, 0x42, 363 0x00, 0xe2, 0xb8, 0x42,
354 0x01, 0x44, 0xd4, 0x31, 364 0x01, 0x44, 0xd4, 0x31,
355 0x00, 0xe2, 0xa4, 0x42, 365 0x00, 0xe2, 0xb8, 0x42,
356 0x01, 0x00, 0x6c, 0x32, 366 0x01, 0x00, 0x6c, 0x32,
357 0x33, 0xea, 0x5e, 0x59, 367 0x33, 0xea, 0x68, 0x59,
358 0x33, 0xea, 0x00, 0x00, 368 0x33, 0xea, 0x00, 0x00,
359 0x4c, 0x3a, 0xc1, 0x28, 369 0x4c, 0x3a, 0xc1, 0x28,
360 0x01, 0x64, 0xc0, 0x31, 370 0x01, 0x64, 0xc0, 0x31,
361 0x00, 0x36, 0x5f, 0x59, 371 0x00, 0x36, 0x69, 0x59,
362 0x01, 0x36, 0x01, 0x30, 372 0x01, 0x36, 0x01, 0x30,
363 0x01, 0xe0, 0xda, 0x7a, 373 0x01, 0xe0, 0xee, 0x7a,
364 0xa0, 0xea, 0xf4, 0x5b, 374 0xa0, 0xea, 0x08, 0x5c,
365 0x01, 0xa0, 0xda, 0x62, 375 0x01, 0xa0, 0xee, 0x62,
366 0x01, 0x84, 0xcf, 0x7a, 376 0x01, 0x84, 0xe3, 0x7a,
367 0x01, 0x95, 0xdd, 0x6a, 377 0x01, 0x95, 0xf1, 0x6a,
368 0x05, 0xea, 0x64, 0x59, 378 0x05, 0xea, 0x6e, 0x59,
369 0x05, 0xea, 0x04, 0x00, 379 0x05, 0xea, 0x04, 0x00,
370 0x00, 0xe2, 0xdc, 0x42, 380 0x00, 0xe2, 0xf0, 0x42,
371 0x03, 0xea, 0x64, 0x59, 381 0x03, 0xea, 0x6e, 0x59,
372 0x03, 0xea, 0x04, 0x00, 382 0x03, 0xea, 0x04, 0x00,
373 0x00, 0xe2, 0xdc, 0x42, 383 0x00, 0xe2, 0xf0, 0x42,
374 0x07, 0xea, 0x06, 0x5c, 384 0x07, 0xea, 0x1a, 0x5c,
375 0x01, 0x44, 0xd4, 0x31, 385 0x01, 0x44, 0xd4, 0x31,
376 0x00, 0xe2, 0x14, 0x42, 386 0x00, 0xe2, 0x28, 0x42,
377 0x3f, 0xe0, 0x76, 0x0a, 387 0x3f, 0xe0, 0x76, 0x0a,
378 0xc0, 0x3a, 0xc1, 0x09, 388 0xc0, 0x3a, 0xc1, 0x09,
379 0x00, 0x3b, 0x51, 0x01, 389 0x00, 0x3b, 0x51, 0x01,
@@ -384,54 +394,54 @@ static uint8_t seqprog[] = {
384 0x01, 0xea, 0xc6, 0x01, 394 0x01, 0xea, 0xc6, 0x01,
385 0x02, 0xe2, 0xc8, 0x31, 395 0x02, 0xe2, 0xc8, 0x31,
386 0x02, 0xec, 0x40, 0x31, 396 0x02, 0xec, 0x40, 0x31,
387 0xff, 0xa1, 0xfc, 0x72, 397 0xff, 0xa1, 0x10, 0x73,
388 0x02, 0xe8, 0xda, 0x31, 398 0x02, 0xe8, 0xda, 0x31,
389 0x02, 0xa0, 0x50, 0x31, 399 0x02, 0xa0, 0x50, 0x31,
390 0x00, 0xe2, 0x1e, 0x43, 400 0x00, 0xe2, 0x32, 0x43,
391 0x80, 0x39, 0x73, 0x02, 401 0x80, 0x39, 0x73, 0x02,
392 0x01, 0x44, 0xd4, 0x31, 402 0x01, 0x44, 0xd4, 0x31,
393 0x00, 0xe2, 0xe2, 0x5b, 403 0x00, 0xe2, 0xf6, 0x5b,
394 0x01, 0x39, 0x73, 0x02, 404 0x01, 0x39, 0x73, 0x02,
395 0xe0, 0x3c, 0x39, 0x63, 405 0xe0, 0x3c, 0x4d, 0x63,
396 0x02, 0x39, 0x73, 0x02, 406 0x02, 0x39, 0x73, 0x02,
397 0x20, 0x46, 0x32, 0x63, 407 0x20, 0x46, 0x46, 0x63,
398 0xff, 0xea, 0x52, 0x09, 408 0xff, 0xea, 0x52, 0x09,
399 0xa8, 0xea, 0xf4, 0x5b, 409 0xa8, 0xea, 0x08, 0x5c,
400 0x04, 0x92, 0x19, 0x7b, 410 0x04, 0x92, 0x2d, 0x7b,
401 0x01, 0x3a, 0xc1, 0x31, 411 0x01, 0x3a, 0xc1, 0x31,
402 0x00, 0x93, 0x19, 0x63, 412 0x00, 0x93, 0x2d, 0x63,
403 0x01, 0x3b, 0xc1, 0x31, 413 0x01, 0x3b, 0xc1, 0x31,
404 0x00, 0x94, 0x23, 0x73, 414 0x00, 0x94, 0x37, 0x73,
405 0x01, 0xa9, 0x52, 0x11, 415 0x01, 0xa9, 0x52, 0x11,
406 0xff, 0xa9, 0x0e, 0x6b, 416 0xff, 0xa9, 0x22, 0x6b,
407 0x00, 0xe2, 0x32, 0x43, 417 0x00, 0xe2, 0x46, 0x43,
408 0x10, 0x39, 0x73, 0x02, 418 0x10, 0x39, 0x73, 0x02,
409 0x04, 0x92, 0x33, 0x7b, 419 0x04, 0x92, 0x47, 0x7b,
410 0xfb, 0x92, 0x25, 0x0b, 420 0xfb, 0x92, 0x25, 0x0b,
411 0xff, 0xea, 0x72, 0x0a, 421 0xff, 0xea, 0x72, 0x0a,
412 0x01, 0xa4, 0x2d, 0x6b, 422 0x01, 0xa4, 0x41, 0x6b,
413 0x02, 0xa8, 0x9c, 0x32, 423 0x02, 0xa8, 0x9c, 0x32,
414 0x00, 0xe2, 0x7e, 0x59, 424 0x00, 0xe2, 0x88, 0x59,
415 0x10, 0x92, 0xdd, 0x7a, 425 0x10, 0x92, 0xf1, 0x7a,
416 0xff, 0xea, 0x06, 0x5c, 426 0xff, 0xea, 0x1a, 0x5c,
417 0x00, 0xe2, 0xdc, 0x42, 427 0x00, 0xe2, 0xf0, 0x42,
418 0x04, 0xea, 0x64, 0x59, 428 0x04, 0xea, 0x6e, 0x59,
419 0x04, 0xea, 0x04, 0x00, 429 0x04, 0xea, 0x04, 0x00,
420 0x00, 0xe2, 0xdc, 0x42, 430 0x00, 0xe2, 0xf0, 0x42,
421 0x04, 0xea, 0x64, 0x59, 431 0x04, 0xea, 0x6e, 0x59,
422 0x04, 0xea, 0x04, 0x00, 432 0x04, 0xea, 0x04, 0x00,
423 0x00, 0xe2, 0x14, 0x42, 433 0x00, 0xe2, 0x28, 0x42,
424 0x08, 0x92, 0xd5, 0x7a, 434 0x08, 0x92, 0xe9, 0x7a,
425 0xc0, 0x39, 0x49, 0x7b, 435 0xc0, 0x39, 0x5d, 0x7b,
426 0x80, 0x39, 0xd5, 0x6a, 436 0x80, 0x39, 0xe9, 0x6a,
427 0xff, 0x88, 0x49, 0x6b, 437 0xff, 0x88, 0x5d, 0x6b,
428 0x40, 0x39, 0xd5, 0x6a, 438 0x40, 0x39, 0xe9, 0x6a,
429 0x10, 0x92, 0x4f, 0x7b, 439 0x10, 0x92, 0x63, 0x7b,
430 0x0a, 0xea, 0x64, 0x59, 440 0x0a, 0xea, 0x6e, 0x59,
431 0x0a, 0xea, 0x04, 0x00, 441 0x0a, 0xea, 0x04, 0x00,
432 0x00, 0xe2, 0x6e, 0x5b, 442 0x00, 0xe2, 0x82, 0x5b,
433 0x00, 0xe2, 0xae, 0x43, 443 0x00, 0xe2, 0xc2, 0x43,
434 0x50, 0x4b, 0x56, 0x6b, 444 0x50, 0x4b, 0x6a, 0x6b,
435 0xbf, 0x3a, 0x74, 0x08, 445 0xbf, 0x3a, 0x74, 0x08,
436 0x01, 0xe0, 0xf4, 0x31, 446 0x01, 0xe0, 0xf4, 0x31,
437 0xff, 0xea, 0xc0, 0x09, 447 0xff, 0xea, 0xc0, 0x09,
@@ -441,31 +451,31 @@ static uint8_t seqprog[] = {
441 0x01, 0xfa, 0xc0, 0x35, 451 0x01, 0xfa, 0xc0, 0x35,
442 0x02, 0xa8, 0x90, 0x32, 452 0x02, 0xa8, 0x90, 0x32,
443 0x02, 0xea, 0xb4, 0x00, 453 0x02, 0xea, 0xb4, 0x00,
444 0x33, 0xea, 0x5e, 0x59, 454 0x33, 0xea, 0x68, 0x59,
445 0x33, 0xea, 0x00, 0x00, 455 0x33, 0xea, 0x00, 0x00,
446 0x02, 0x48, 0x51, 0x31, 456 0x02, 0x48, 0x51, 0x31,
447 0xff, 0x90, 0x85, 0x68, 457 0xff, 0x90, 0x85, 0x68,
448 0xff, 0x88, 0x7b, 0x6b, 458 0xff, 0x88, 0x8f, 0x6b,
449 0x01, 0xa4, 0x77, 0x6b, 459 0x01, 0xa4, 0x8b, 0x6b,
450 0x02, 0xa4, 0x7f, 0x6b, 460 0x02, 0xa4, 0x93, 0x6b,
451 0x01, 0x84, 0x7f, 0x7b, 461 0x01, 0x84, 0x93, 0x7b,
452 0x02, 0x28, 0x19, 0x33, 462 0x02, 0x28, 0x19, 0x33,
453 0x02, 0xa8, 0x50, 0x36, 463 0x02, 0xa8, 0x50, 0x36,
454 0xff, 0x88, 0x7f, 0x73, 464 0xff, 0x88, 0x93, 0x73,
455 0x00, 0xe2, 0x52, 0x5b, 465 0x00, 0xe2, 0x66, 0x5b,
456 0x02, 0xa8, 0x20, 0x33, 466 0x02, 0xa8, 0x20, 0x33,
457 0x04, 0xa4, 0x49, 0x03, 467 0x04, 0xa4, 0x49, 0x03,
458 0xff, 0xea, 0x1a, 0x03, 468 0xff, 0xea, 0x1a, 0x03,
459 0xff, 0x2d, 0x8b, 0x63, 469 0xff, 0x2d, 0x9f, 0x63,
460 0x02, 0xa8, 0x58, 0x32, 470 0x02, 0xa8, 0x58, 0x32,
461 0x02, 0xa8, 0x5c, 0x36, 471 0x02, 0xa8, 0x5c, 0x36,
462 0x02, 0xa8, 0x40, 0x31, 472 0x02, 0xa8, 0x40, 0x31,
463 0x02, 0x2e, 0x51, 0x31, 473 0x02, 0x2e, 0x51, 0x31,
464 0x02, 0xa0, 0x18, 0x33, 474 0x02, 0xa0, 0x18, 0x33,
465 0x02, 0xa0, 0x5c, 0x36, 475 0x02, 0xa0, 0x5c, 0x36,
466 0xc0, 0x39, 0xd5, 0x6a, 476 0xc0, 0x39, 0xe9, 0x6a,
467 0x04, 0x92, 0x25, 0x03, 477 0x04, 0x92, 0x25, 0x03,
468 0x20, 0x92, 0xaf, 0x6b, 478 0x20, 0x92, 0xc3, 0x6b,
469 0x02, 0xa8, 0x40, 0x31, 479 0x02, 0xa8, 0x40, 0x31,
470 0xc0, 0x3a, 0xc1, 0x09, 480 0xc0, 0x3a, 0xc1, 0x09,
471 0x00, 0x3b, 0x51, 0x01, 481 0x00, 0x3b, 0x51, 0x01,
@@ -480,60 +490,60 @@ static uint8_t seqprog[] = {
480 0xf7, 0x57, 0xae, 0x08, 490 0xf7, 0x57, 0xae, 0x08,
481 0x08, 0xea, 0x98, 0x00, 491 0x08, 0xea, 0x98, 0x00,
482 0x01, 0x44, 0xd4, 0x31, 492 0x01, 0x44, 0xd4, 0x31,
483 0xee, 0x00, 0xb8, 0x6b, 493 0xee, 0x00, 0xcc, 0x6b,
484 0x02, 0xea, 0xb4, 0x00, 494 0x02, 0xea, 0xb4, 0x00,
485 0xc0, 0xea, 0x72, 0x02, 495 0xc0, 0xea, 0x72, 0x02,
486 0x09, 0x4c, 0xba, 0x7b, 496 0x09, 0x4c, 0xce, 0x7b,
487 0x01, 0xea, 0x78, 0x02, 497 0x01, 0xea, 0x78, 0x02,
488 0x08, 0x4c, 0x06, 0x68, 498 0x08, 0x4c, 0x06, 0x68,
489 0x0b, 0xea, 0x64, 0x59, 499 0x0b, 0xea, 0x6e, 0x59,
490 0x0b, 0xea, 0x04, 0x00, 500 0x0b, 0xea, 0x04, 0x00,
491 0x01, 0x44, 0xd4, 0x31, 501 0x01, 0x44, 0xd4, 0x31,
492 0x20, 0x39, 0x15, 0x7a, 502 0x20, 0x39, 0x29, 0x7a,
493 0x00, 0xe2, 0xcc, 0x5b, 503 0x00, 0xe2, 0xe0, 0x5b,
494 0x00, 0xe2, 0x14, 0x42, 504 0x00, 0xe2, 0x28, 0x42,
495 0x01, 0x84, 0xd1, 0x7b, 505 0x01, 0x84, 0xe5, 0x7b,
496 0x01, 0xa4, 0x49, 0x07, 506 0x01, 0xa4, 0x49, 0x07,
497 0x08, 0x60, 0x30, 0x33, 507 0x08, 0x60, 0x30, 0x33,
498 0x08, 0x80, 0x41, 0x37, 508 0x08, 0x80, 0x41, 0x37,
499 0xdf, 0x39, 0x73, 0x0a, 509 0xdf, 0x39, 0x73, 0x0a,
500 0xee, 0x00, 0xde, 0x6b, 510 0xee, 0x00, 0xf2, 0x6b,
501 0x05, 0xea, 0xb4, 0x00, 511 0x05, 0xea, 0xb4, 0x00,
502 0x33, 0xea, 0x5e, 0x59, 512 0x33, 0xea, 0x68, 0x59,
503 0x33, 0xea, 0x00, 0x00, 513 0x33, 0xea, 0x00, 0x00,
504 0x00, 0xe2, 0x7e, 0x59, 514 0x00, 0xe2, 0x88, 0x59,
505 0x00, 0xe2, 0xdc, 0x42, 515 0x00, 0xe2, 0xf0, 0x42,
506 0xff, 0x42, 0xee, 0x6b, 516 0xff, 0x42, 0x02, 0x6c,
507 0x01, 0x41, 0xe2, 0x6b, 517 0x01, 0x41, 0xf6, 0x6b,
508 0x02, 0x41, 0xe2, 0x7b, 518 0x02, 0x41, 0xf6, 0x7b,
509 0xff, 0x42, 0xee, 0x6b, 519 0xff, 0x42, 0x02, 0x6c,
510 0x01, 0x41, 0xe2, 0x6b, 520 0x01, 0x41, 0xf6, 0x6b,
511 0x02, 0x41, 0xe2, 0x7b, 521 0x02, 0x41, 0xf6, 0x7b,
512 0xff, 0x42, 0xee, 0x7b, 522 0xff, 0x42, 0x02, 0x7c,
513 0x04, 0x4c, 0xe2, 0x6b, 523 0x04, 0x4c, 0xf6, 0x6b,
514 0xe0, 0x41, 0x78, 0x0e, 524 0xe0, 0x41, 0x78, 0x0e,
515 0x01, 0x44, 0xd4, 0x31, 525 0x01, 0x44, 0xd4, 0x31,
516 0xff, 0x42, 0xf6, 0x7b, 526 0xff, 0x42, 0x0a, 0x7c,
517 0x04, 0x4c, 0xf6, 0x6b, 527 0x04, 0x4c, 0x0a, 0x6c,
518 0xe0, 0x41, 0x78, 0x0a, 528 0xe0, 0x41, 0x78, 0x0a,
519 0xe0, 0x3c, 0x15, 0x62, 529 0xe0, 0x3c, 0x29, 0x62,
520 0xff, 0xea, 0xca, 0x09, 530 0xff, 0xea, 0xca, 0x09,
521 0x01, 0xe2, 0xc8, 0x31, 531 0x01, 0xe2, 0xc8, 0x31,
522 0x01, 0x46, 0xda, 0x35, 532 0x01, 0x46, 0xda, 0x35,
523 0x01, 0x44, 0xd4, 0x35, 533 0x01, 0x44, 0xd4, 0x35,
524 0x10, 0xea, 0x80, 0x00, 534 0x10, 0xea, 0x80, 0x00,
525 0x01, 0xe2, 0x6e, 0x36, 535 0x01, 0xe2, 0x6e, 0x36,
526 0x04, 0xa6, 0x0e, 0x7c, 536 0x04, 0xa6, 0x22, 0x7c,
527 0xff, 0xea, 0x5a, 0x09, 537 0xff, 0xea, 0x5a, 0x09,
528 0xff, 0xea, 0x4c, 0x0d, 538 0xff, 0xea, 0x4c, 0x0d,
529 0x01, 0xa6, 0x3a, 0x6c, 539 0x01, 0xa6, 0x4e, 0x6c,
530 0x10, 0xad, 0x84, 0x78, 540 0x10, 0xad, 0x84, 0x78,
531 0x80, 0xad, 0x32, 0x6c, 541 0x80, 0xad, 0x46, 0x6c,
532 0x08, 0xad, 0x84, 0x68, 542 0x08, 0xad, 0x84, 0x68,
533 0x20, 0x19, 0x26, 0x7c, 543 0x20, 0x19, 0x3a, 0x7c,
534 0x80, 0xea, 0xb2, 0x01, 544 0x80, 0xea, 0xb2, 0x01,
535 0x11, 0x00, 0x00, 0x10, 545 0x11, 0x00, 0x00, 0x10,
536 0x02, 0xa6, 0x22, 0x7c, 546 0x02, 0xa6, 0x36, 0x7c,
537 0xff, 0xea, 0xb2, 0x0d, 547 0xff, 0xea, 0xb2, 0x0d,
538 0x11, 0x00, 0x00, 0x10, 548 0x11, 0x00, 0x00, 0x10,
539 0xff, 0xea, 0xb2, 0x09, 549 0xff, 0xea, 0xb2, 0x09,
@@ -561,7 +571,7 @@ static uint8_t seqprog[] = {
561 0x00, 0x86, 0x0d, 0x23, 571 0x00, 0x86, 0x0d, 0x23,
562 0x00, 0x87, 0x0f, 0x23, 572 0x00, 0x87, 0x0f, 0x23,
563 0x01, 0x84, 0xc5, 0x31, 573 0x01, 0x84, 0xc5, 0x31,
564 0x80, 0x83, 0x5d, 0x7c, 574 0x80, 0x83, 0x71, 0x7c,
565 0x02, 0xe2, 0xc4, 0x01, 575 0x02, 0xe2, 0xc4, 0x01,
566 0xff, 0xea, 0x4c, 0x09, 576 0xff, 0xea, 0x4c, 0x09,
567 0x01, 0xe2, 0x36, 0x30, 577 0x01, 0xe2, 0x36, 0x30,
@@ -572,75 +582,75 @@ static uint8_t seqprog[] = {
572 0xfe, 0xa6, 0x4c, 0x0d, 582 0xfe, 0xa6, 0x4c, 0x0d,
573 0x0b, 0x98, 0xe1, 0x30, 583 0x0b, 0x98, 0xe1, 0x30,
574 0xfd, 0xa4, 0x49, 0x09, 584 0xfd, 0xa4, 0x49, 0x09,
575 0x80, 0xa3, 0x71, 0x7c, 585 0x80, 0xa3, 0x85, 0x7c,
576 0x02, 0xa4, 0x48, 0x01, 586 0x02, 0xa4, 0x48, 0x01,
577 0x01, 0xa4, 0x36, 0x30, 587 0x01, 0xa4, 0x36, 0x30,
578 0xa8, 0xea, 0x32, 0x00, 588 0xa8, 0xea, 0x32, 0x00,
579 0xfd, 0xa4, 0x49, 0x0b, 589 0xfd, 0xa4, 0x49, 0x0b,
580 0x05, 0xa3, 0x07, 0x33, 590 0x05, 0xa3, 0x07, 0x33,
581 0x80, 0x83, 0x7d, 0x6c, 591 0x80, 0x83, 0x91, 0x6c,
582 0x02, 0xea, 0x4c, 0x05, 592 0x02, 0xea, 0x4c, 0x05,
583 0xff, 0xea, 0x4c, 0x0d, 593 0xff, 0xea, 0x4c, 0x0d,
584 0x00, 0xe2, 0x56, 0x59, 594 0x00, 0xe2, 0x60, 0x59,
585 0x02, 0xa6, 0x10, 0x6c, 595 0x02, 0xa6, 0x24, 0x6c,
586 0x80, 0xf9, 0xf2, 0x05, 596 0x80, 0xf9, 0xf2, 0x05,
587 0xc0, 0x39, 0x8b, 0x7c, 597 0xc0, 0x39, 0x9f, 0x7c,
588 0x03, 0xea, 0x64, 0x59, 598 0x03, 0xea, 0x6e, 0x59,
589 0x03, 0xea, 0x04, 0x00, 599 0x03, 0xea, 0x04, 0x00,
590 0x20, 0x39, 0xaf, 0x7c, 600 0x20, 0x39, 0xc3, 0x7c,
591 0x01, 0x84, 0x95, 0x6c, 601 0x01, 0x84, 0xa9, 0x6c,
592 0x06, 0xea, 0x64, 0x59, 602 0x06, 0xea, 0x6e, 0x59,
593 0x06, 0xea, 0x04, 0x00, 603 0x06, 0xea, 0x04, 0x00,
594 0x00, 0xe2, 0xb2, 0x44, 604 0x00, 0xe2, 0xc6, 0x44,
595 0x01, 0x00, 0x6c, 0x32, 605 0x01, 0x00, 0x6c, 0x32,
596 0xee, 0x00, 0x9e, 0x6c, 606 0xee, 0x00, 0xb2, 0x6c,
597 0x05, 0xea, 0xb4, 0x00, 607 0x05, 0xea, 0xb4, 0x00,
598 0x33, 0xea, 0x5e, 0x59, 608 0x33, 0xea, 0x68, 0x59,
599 0x33, 0xea, 0x00, 0x00, 609 0x33, 0xea, 0x00, 0x00,
600 0x80, 0x3d, 0x7a, 0x00, 610 0x80, 0x3d, 0x7a, 0x00,
601 0xfc, 0x42, 0xa0, 0x7c, 611 0xfc, 0x42, 0xb4, 0x7c,
602 0x7f, 0x3d, 0x7a, 0x08, 612 0x7f, 0x3d, 0x7a, 0x08,
603 0x00, 0x36, 0x5f, 0x59, 613 0x00, 0x36, 0x69, 0x59,
604 0x01, 0x36, 0x01, 0x30, 614 0x01, 0x36, 0x01, 0x30,
605 0x09, 0xea, 0x64, 0x59, 615 0x09, 0xea, 0x6e, 0x59,
606 0x09, 0xea, 0x04, 0x00, 616 0x09, 0xea, 0x04, 0x00,
607 0x00, 0xe2, 0x14, 0x42, 617 0x00, 0xe2, 0x28, 0x42,
608 0x01, 0xa4, 0x95, 0x6c, 618 0x01, 0xa4, 0xa9, 0x6c,
609 0x00, 0xe2, 0x68, 0x5c, 619 0x00, 0xe2, 0x7c, 0x5c,
610 0x20, 0x39, 0x73, 0x02, 620 0x20, 0x39, 0x73, 0x02,
611 0x01, 0x00, 0x6c, 0x32, 621 0x01, 0x00, 0x6c, 0x32,
612 0x02, 0xa6, 0xba, 0x7c, 622 0x02, 0xa6, 0xce, 0x7c,
613 0x00, 0xe2, 0x7e, 0x5c, 623 0x00, 0xe2, 0x92, 0x5c,
614 0x00, 0xe2, 0x76, 0x58, 624 0x00, 0xe2, 0x76, 0x58,
615 0x00, 0xe2, 0x86, 0x58, 625 0x00, 0xe2, 0x86, 0x58,
616 0x00, 0xe2, 0x5a, 0x58, 626 0x00, 0xe2, 0x5a, 0x58,
617 0x00, 0x36, 0x5f, 0x59, 627 0x00, 0x36, 0x69, 0x59,
618 0x01, 0x36, 0x01, 0x30, 628 0x01, 0x36, 0x01, 0x30,
619 0x20, 0x19, 0xba, 0x6c, 629 0x20, 0x19, 0xce, 0x6c,
620 0x00, 0xe2, 0xea, 0x5c, 630 0x00, 0xe2, 0xfe, 0x5c,
621 0x04, 0x19, 0xd4, 0x6c, 631 0x04, 0x19, 0xe8, 0x6c,
622 0x02, 0x19, 0x32, 0x00, 632 0x02, 0x19, 0x32, 0x00,
623 0x01, 0x84, 0xd5, 0x7c, 633 0x01, 0x84, 0xe9, 0x7c,
624 0x01, 0x1b, 0xce, 0x7c, 634 0x01, 0x1b, 0xe2, 0x7c,
625 0x01, 0x1a, 0xd4, 0x6c, 635 0x01, 0x1a, 0xe8, 0x6c,
626 0x00, 0xe2, 0x84, 0x44, 636 0x00, 0xe2, 0x98, 0x44,
627 0x80, 0x4b, 0xda, 0x6c, 637 0x80, 0x4b, 0xee, 0x6c,
628 0x01, 0x4c, 0xd6, 0x7c, 638 0x01, 0x4c, 0xea, 0x7c,
629 0x03, 0x42, 0x84, 0x6c, 639 0x03, 0x42, 0x98, 0x6c,
630 0x00, 0xe2, 0x0a, 0x5c, 640 0x00, 0xe2, 0x1e, 0x5c,
631 0x80, 0xf9, 0xf2, 0x01, 641 0x80, 0xf9, 0xf2, 0x01,
632 0x04, 0x39, 0x15, 0x7a, 642 0x04, 0x39, 0x29, 0x7a,
633 0x00, 0xe2, 0x14, 0x42, 643 0x00, 0xe2, 0x28, 0x42,
634 0x08, 0x5d, 0xf2, 0x6c, 644 0x08, 0x5d, 0x06, 0x6d,
635 0x00, 0xe2, 0x76, 0x58, 645 0x00, 0xe2, 0x76, 0x58,
636 0x00, 0x36, 0x5f, 0x59, 646 0x00, 0x36, 0x69, 0x59,
637 0x01, 0x36, 0x01, 0x30, 647 0x01, 0x36, 0x01, 0x30,
638 0x02, 0x1b, 0xe2, 0x7c, 648 0x02, 0x1b, 0xf6, 0x7c,
639 0x08, 0x5d, 0xf0, 0x7c, 649 0x08, 0x5d, 0x04, 0x7d,
640 0x03, 0x68, 0x00, 0x37, 650 0x03, 0x68, 0x00, 0x37,
641 0x01, 0x84, 0x09, 0x07, 651 0x01, 0x84, 0x09, 0x07,
642 0x80, 0x1b, 0xfc, 0x7c, 652 0x80, 0x1b, 0x10, 0x7d,
643 0x80, 0x84, 0xfd, 0x6c, 653 0x80, 0x84, 0x11, 0x6d,
644 0xff, 0x85, 0x0b, 0x1b, 654 0xff, 0x85, 0x0b, 0x1b,
645 0xff, 0x86, 0x0d, 0x23, 655 0xff, 0x86, 0x0d, 0x23,
646 0xff, 0x87, 0x0f, 0x23, 656 0xff, 0x87, 0x0f, 0x23,
@@ -652,161 +662,164 @@ static uint8_t seqprog[] = {
652 0xf9, 0xd9, 0xb2, 0x0d, 662 0xf9, 0xd9, 0xb2, 0x0d,
653 0x01, 0xd9, 0xb2, 0x05, 663 0x01, 0xd9, 0xb2, 0x05,
654 0x01, 0x52, 0x48, 0x31, 664 0x01, 0x52, 0x48, 0x31,
655 0x20, 0xa4, 0x26, 0x7d, 665 0x20, 0xa4, 0x3a, 0x7d,
656 0x20, 0x5b, 0x26, 0x7d, 666 0x20, 0x5b, 0x3a, 0x7d,
657 0x80, 0xf9, 0x34, 0x7d, 667 0x80, 0xf9, 0x48, 0x7d,
658 0x02, 0xea, 0xb4, 0x00, 668 0x02, 0xea, 0xb4, 0x00,
659 0x11, 0x00, 0x00, 0x10, 669 0x11, 0x00, 0x00, 0x10,
660 0x04, 0x19, 0x40, 0x7d, 670 0x04, 0x19, 0x54, 0x7d,
661 0xdf, 0x19, 0x32, 0x08, 671 0xdf, 0x19, 0x32, 0x08,
662 0x60, 0x5b, 0x40, 0x6d, 672 0x60, 0x5b, 0x54, 0x6d,
663 0x01, 0x4c, 0x1a, 0x7d, 673 0x01, 0x4c, 0x2e, 0x7d,
664 0x20, 0x19, 0x32, 0x00, 674 0x20, 0x19, 0x32, 0x00,
665 0x01, 0xd9, 0xb2, 0x05, 675 0x01, 0xd9, 0xb2, 0x05,
666 0x02, 0xea, 0xb4, 0x00, 676 0x02, 0xea, 0xb4, 0x00,
667 0x01, 0xd9, 0xb2, 0x05, 677 0x01, 0xd9, 0xb2, 0x05,
668 0x10, 0x5b, 0x38, 0x6d, 678 0x10, 0x5b, 0x4c, 0x6d,
669 0x08, 0x5b, 0x42, 0x6d, 679 0x08, 0x5b, 0x56, 0x6d,
670 0x20, 0x5b, 0x32, 0x6d, 680 0x20, 0x5b, 0x46, 0x6d,
671 0x02, 0x5b, 0x62, 0x6d, 681 0x02, 0x5b, 0x76, 0x6d,
672 0x0e, 0xea, 0x64, 0x59, 682 0x0e, 0xea, 0x6e, 0x59,
673 0x0e, 0xea, 0x04, 0x00, 683 0x0e, 0xea, 0x04, 0x00,
674 0x80, 0xf9, 0x22, 0x6d, 684 0x80, 0xf9, 0x36, 0x6d,
675 0xdf, 0x5c, 0xb8, 0x08, 685 0xdf, 0x5c, 0xb8, 0x08,
676 0x01, 0xd9, 0xb2, 0x05, 686 0x01, 0xd9, 0xb2, 0x05,
677 0x01, 0xa4, 0x1d, 0x6e, 687 0x01, 0xa4, 0x37, 0x6e,
678 0x00, 0xe2, 0x68, 0x5c, 688 0x00, 0xe2, 0x7c, 0x5c,
679 0x00, 0xe2, 0x6c, 0x5d, 689 0x00, 0xe2, 0x80, 0x5d,
680 0x01, 0x90, 0x21, 0x1b, 690 0x01, 0x90, 0x21, 0x1b,
681 0x01, 0xd9, 0xb2, 0x05, 691 0x01, 0xd9, 0xb2, 0x05,
682 0x00, 0xe2, 0x52, 0x5b, 692 0x00, 0xe2, 0x66, 0x5b,
683 0xf3, 0x96, 0xd5, 0x19, 693 0xf3, 0x96, 0xd5, 0x19,
684 0x00, 0xe2, 0x50, 0x55, 694 0x00, 0xe2, 0x64, 0x55,
685 0x80, 0x96, 0x51, 0x6d, 695 0x80, 0x96, 0x65, 0x6d,
686 0x0f, 0xea, 0x64, 0x59, 696 0x0f, 0xea, 0x6e, 0x59,
687 0x0f, 0xea, 0x04, 0x00, 697 0x0f, 0xea, 0x04, 0x00,
688 0x00, 0xe2, 0x58, 0x45, 698 0x00, 0xe2, 0x6c, 0x45,
689 0x04, 0x8c, 0xe1, 0x30, 699 0x04, 0x8c, 0xe1, 0x30,
690 0x01, 0xea, 0xf2, 0x00, 700 0x01, 0xea, 0xf2, 0x00,
691 0x02, 0xea, 0x36, 0x00, 701 0x02, 0xea, 0x36, 0x00,
692 0xa8, 0xea, 0x32, 0x00, 702 0xa8, 0xea, 0x32, 0x00,
693 0xff, 0x97, 0x5f, 0x7d, 703 0xff, 0x97, 0x73, 0x7d,
694 0x14, 0xea, 0x64, 0x59, 704 0x14, 0xea, 0x6e, 0x59,
695 0x14, 0xea, 0x04, 0x00, 705 0x14, 0xea, 0x04, 0x00,
696 0x00, 0xe2, 0xce, 0x5d, 706 0x00, 0xe2, 0xe2, 0x5d,
697 0x01, 0xd9, 0xb2, 0x05, 707 0x01, 0xd9, 0xb2, 0x05,
698 0x09, 0x80, 0xe1, 0x30, 708 0x09, 0x80, 0xe1, 0x30,
699 0x02, 0xea, 0x36, 0x00, 709 0x02, 0xea, 0x36, 0x00,
700 0xa8, 0xea, 0x32, 0x00, 710 0xa8, 0xea, 0x32, 0x00,
701 0x00, 0xe2, 0xc6, 0x5d, 711 0x00, 0xe2, 0xda, 0x5d,
702 0x01, 0xd9, 0xb2, 0x05, 712 0x01, 0xd9, 0xb2, 0x05,
703 0x02, 0xa6, 0x7c, 0x7d, 713 0x02, 0xa6, 0x90, 0x7d,
704 0x00, 0xe2, 0x56, 0x59, 714 0x00, 0xe2, 0x60, 0x59,
705 0x20, 0x5b, 0x8a, 0x6d, 715 0x20, 0x5b, 0x9e, 0x6d,
706 0xfc, 0x42, 0x76, 0x7d, 716 0xfc, 0x42, 0x8a, 0x7d,
707 0x10, 0x40, 0x78, 0x6d, 717 0x10, 0x40, 0x8c, 0x6d,
708 0x20, 0x4d, 0x7a, 0x7d, 718 0x20, 0x4d, 0x8e, 0x7d,
709 0x08, 0x5d, 0x8a, 0x6d, 719 0x08, 0x5d, 0x9e, 0x6d,
710 0x02, 0xa6, 0x10, 0x6c, 720 0x02, 0xa6, 0x24, 0x6c,
711 0x00, 0xe2, 0x56, 0x59, 721 0x00, 0xe2, 0x60, 0x59,
712 0x20, 0x5b, 0x8a, 0x6d, 722 0x20, 0x5b, 0x9e, 0x6d,
713 0x01, 0x1b, 0xaa, 0x6d, 723 0x01, 0x1b, 0xbe, 0x6d,
714 0xfc, 0x42, 0x86, 0x7d, 724 0xfc, 0x42, 0x9a, 0x7d,
715 0x10, 0x40, 0x88, 0x6d, 725 0x10, 0x40, 0x9c, 0x6d,
716 0x20, 0x4d, 0x84, 0x78, 726 0x20, 0x4d, 0x84, 0x78,
717 0x08, 0x5d, 0x84, 0x78, 727 0x08, 0x5d, 0x84, 0x78,
718 0x02, 0x19, 0x32, 0x00, 728 0x02, 0x19, 0x32, 0x00,
719 0x01, 0x5b, 0x40, 0x31, 729 0x01, 0x5b, 0x40, 0x31,
720 0x00, 0xe2, 0xea, 0x5c, 730 0x00, 0xe2, 0xfe, 0x5c,
721 0x00, 0xe2, 0xcc, 0x5b, 731 0x00, 0xe2, 0xe0, 0x5b,
722 0x20, 0xea, 0xb6, 0x00, 732 0x20, 0xea, 0xb6, 0x00,
723 0x00, 0xe2, 0x0a, 0x5c, 733 0x00, 0xe2, 0x1e, 0x5c,
724 0x20, 0x5c, 0xb8, 0x00, 734 0x20, 0x5c, 0xb8, 0x00,
725 0x04, 0x19, 0xa0, 0x6d, 735 0x04, 0x19, 0xb4, 0x6d,
726 0x01, 0x1a, 0xa0, 0x6d, 736 0x01, 0x1a, 0xb4, 0x6d,
727 0x00, 0xe2, 0x56, 0x59, 737 0x00, 0xe2, 0x60, 0x59,
728 0x01, 0x1a, 0x84, 0x78, 738 0x01, 0x1a, 0x84, 0x78,
729 0x80, 0xf9, 0xf2, 0x01, 739 0x80, 0xf9, 0xf2, 0x01,
730 0x20, 0xa0, 0x04, 0x7e, 740 0x20, 0xa0, 0x18, 0x7e,
731 0xff, 0x90, 0x21, 0x1b, 741 0xff, 0x90, 0x21, 0x1b,
732 0x08, 0x92, 0x63, 0x6b, 742 0x08, 0x92, 0x77, 0x6b,
733 0x02, 0xea, 0xb4, 0x04, 743 0x02, 0xea, 0xb4, 0x04,
734 0x01, 0xa4, 0x49, 0x03, 744 0x01, 0xa4, 0x49, 0x03,
735 0x40, 0x5b, 0xba, 0x6d, 745 0x40, 0x5b, 0xce, 0x6d,
736 0x00, 0xe2, 0x56, 0x59, 746 0x00, 0xe2, 0x60, 0x59,
737 0x40, 0x5b, 0xba, 0x6d, 747 0x40, 0x5b, 0xce, 0x6d,
738 0x04, 0x5d, 0x1e, 0x7e, 748 0x04, 0x5d, 0x38, 0x7e,
739 0x01, 0x1a, 0x1e, 0x7e, 749 0x01, 0x1a, 0x38, 0x7e,
740 0x20, 0x4d, 0x84, 0x78, 750 0x20, 0x4d, 0x84, 0x78,
741 0x40, 0x5b, 0x04, 0x7e, 751 0x40, 0x5b, 0x18, 0x7e,
742 0x04, 0x5d, 0x1e, 0x7e, 752 0x04, 0x5d, 0x38, 0x7e,
743 0x01, 0x1a, 0x1e, 0x7e, 753 0x01, 0x1a, 0x38, 0x7e,
744 0x80, 0xf9, 0xf2, 0x01, 754 0x80, 0xf9, 0xf2, 0x01,
745 0xff, 0x90, 0x21, 0x1b, 755 0xff, 0x90, 0x21, 0x1b,
746 0x08, 0x92, 0x63, 0x6b, 756 0x08, 0x92, 0x77, 0x6b,
747 0x02, 0xea, 0xb4, 0x04, 757 0x02, 0xea, 0xb4, 0x04,
748 0x00, 0xe2, 0x56, 0x59, 758 0x00, 0xe2, 0x60, 0x59,
749 0x01, 0x1b, 0x84, 0x78, 759 0x01, 0x1b, 0x84, 0x78,
750 0x80, 0xf9, 0xf2, 0x01, 760 0x80, 0xf9, 0xf2, 0x01,
751 0x02, 0xea, 0xb4, 0x04, 761 0x02, 0xea, 0xb4, 0x04,
752 0x00, 0xe2, 0x56, 0x59, 762 0x00, 0xe2, 0x60, 0x59,
753 0x01, 0x1b, 0xe2, 0x6d, 763 0x01, 0x1b, 0xf6, 0x6d,
754 0x40, 0x5b, 0xf0, 0x7d, 764 0x40, 0x5b, 0x04, 0x7e,
755 0x01, 0x1b, 0xe2, 0x6d, 765 0x01, 0x1b, 0xf6, 0x6d,
756 0x02, 0x19, 0x32, 0x00, 766 0x02, 0x19, 0x32, 0x00,
757 0x01, 0x1a, 0x84, 0x78, 767 0x01, 0x1a, 0x84, 0x78,
758 0x80, 0xf9, 0xf2, 0x01, 768 0x80, 0xf9, 0xf2, 0x01,
759 0xff, 0xea, 0x10, 0x03, 769 0xff, 0xea, 0x10, 0x03,
760 0x08, 0x92, 0x25, 0x03, 770 0x08, 0x92, 0x25, 0x03,
761 0x00, 0xe2, 0x62, 0x43, 771 0x00, 0xe2, 0x76, 0x43,
762 0x01, 0x1a, 0xec, 0x7d, 772 0x01, 0x1a, 0x00, 0x7e,
763 0x40, 0x5b, 0xe8, 0x7d, 773 0x40, 0x5b, 0xfc, 0x7d,
764 0x01, 0x1a, 0xd6, 0x6d, 774 0x01, 0x1a, 0xea, 0x6d,
765 0xfc, 0x42, 0x84, 0x78, 775 0xfc, 0x42, 0x84, 0x78,
766 0x01, 0x1a, 0xf0, 0x6d, 776 0x01, 0x1a, 0x04, 0x6e,
767 0x10, 0xea, 0x64, 0x59, 777 0x10, 0xea, 0x6e, 0x59,
768 0x10, 0xea, 0x04, 0x00, 778 0x10, 0xea, 0x04, 0x00,
769 0xfc, 0x42, 0x84, 0x78, 779 0xfc, 0x42, 0x84, 0x78,
770 0x10, 0x40, 0xf6, 0x6d, 780 0x10, 0x40, 0x0a, 0x6e,
771 0x20, 0x4d, 0x84, 0x78, 781 0x20, 0x4d, 0x84, 0x78,
772 0x40, 0x5b, 0xd6, 0x6d, 782 0x40, 0x5b, 0xea, 0x6d,
773 0x01, 0x1a, 0x84, 0x78, 783 0x01, 0x1a, 0x84, 0x78,
774 0x01, 0x90, 0x21, 0x1b, 784 0x01, 0x90, 0x21, 0x1b,
775 0x30, 0x3f, 0xc0, 0x09, 785 0x30, 0x3f, 0xc0, 0x09,
776 0x30, 0xe0, 0x84, 0x60, 786 0x30, 0xe0, 0x84, 0x60,
777 0x40, 0x4b, 0x84, 0x68, 787 0x40, 0x4b, 0x84, 0x68,
778 0xff, 0xea, 0x52, 0x01, 788 0xff, 0xea, 0x52, 0x01,
779 0xee, 0x00, 0x0c, 0x6e, 789 0xee, 0x00, 0x20, 0x6e,
780 0x80, 0xf9, 0xf2, 0x01, 790 0x80, 0xf9, 0xf2, 0x01,
781 0xff, 0x90, 0x21, 0x1b, 791 0xff, 0x90, 0x21, 0x1b,
782 0x02, 0xea, 0xb4, 0x00, 792 0x02, 0xea, 0xb4, 0x00,
783 0x20, 0xea, 0x9a, 0x00, 793 0x20, 0xea, 0x9a, 0x00,
784 0xf3, 0x42, 0x16, 0x6e, 794 0x04, 0x41, 0x26, 0x7e,
785 0x12, 0xea, 0x64, 0x59, 795 0x08, 0xea, 0x98, 0x00,
796 0x08, 0x57, 0xae, 0x00,
797 0xf3, 0x42, 0x30, 0x6e,
798 0x12, 0xea, 0x6e, 0x59,
786 0x12, 0xea, 0x04, 0x00, 799 0x12, 0xea, 0x04, 0x00,
787 0x00, 0xe2, 0x14, 0x42, 800 0x00, 0xe2, 0x28, 0x42,
788 0x0d, 0xea, 0x64, 0x59, 801 0x0d, 0xea, 0x6e, 0x59,
789 0x0d, 0xea, 0x04, 0x00, 802 0x0d, 0xea, 0x04, 0x00,
790 0x00, 0xe2, 0x14, 0x42, 803 0x00, 0xe2, 0x28, 0x42,
791 0x01, 0x90, 0x21, 0x1b, 804 0x01, 0x90, 0x21, 0x1b,
792 0x11, 0xea, 0x64, 0x59, 805 0x11, 0xea, 0x6e, 0x59,
793 0x11, 0xea, 0x04, 0x00, 806 0x11, 0xea, 0x04, 0x00,
794 0x00, 0xe2, 0x52, 0x5b, 807 0x00, 0xe2, 0x66, 0x5b,
795 0x08, 0x5a, 0xb4, 0x00, 808 0x08, 0x5a, 0xb4, 0x00,
796 0x00, 0xe2, 0x44, 0x5e, 809 0x00, 0xe2, 0x5e, 0x5e,
797 0xa8, 0xea, 0x32, 0x00, 810 0xa8, 0xea, 0x32, 0x00,
798 0x00, 0xe2, 0x56, 0x59, 811 0x00, 0xe2, 0x60, 0x59,
799 0x80, 0x1a, 0x32, 0x7e, 812 0x80, 0x1a, 0x4c, 0x7e,
800 0x00, 0xe2, 0x44, 0x5e, 813 0x00, 0xe2, 0x5e, 0x5e,
801 0x80, 0x19, 0x32, 0x00, 814 0x80, 0x19, 0x32, 0x00,
802 0x40, 0x5b, 0x38, 0x6e, 815 0x40, 0x5b, 0x52, 0x6e,
803 0x08, 0x5a, 0x38, 0x7e, 816 0x08, 0x5a, 0x52, 0x7e,
804 0x20, 0x4d, 0x84, 0x78, 817 0x20, 0x4d, 0x84, 0x78,
805 0x02, 0x84, 0x09, 0x03, 818 0x02, 0x84, 0x09, 0x03,
806 0x40, 0x5b, 0x04, 0x7e, 819 0x40, 0x5b, 0x18, 0x7e,
807 0xff, 0x90, 0x21, 0x1b, 820 0xff, 0x90, 0x21, 0x1b,
808 0x80, 0xf9, 0xf2, 0x01, 821 0x80, 0xf9, 0xf2, 0x01,
809 0x08, 0x92, 0x63, 0x6b, 822 0x08, 0x92, 0x77, 0x6b,
810 0x02, 0xea, 0xb4, 0x04, 823 0x02, 0xea, 0xb4, 0x04,
811 0x01, 0x40, 0xe1, 0x30, 824 0x01, 0x40, 0xe1, 0x30,
812 0x05, 0x41, 0xe3, 0x98, 825 0x05, 0x41, 0xe3, 0x98,
@@ -1039,138 +1052,138 @@ static struct patch {
1039 { ahd_patch0_func, 64, 1, 1 }, 1052 { ahd_patch0_func, 64, 1, 1 },
1040 { ahd_patch2_func, 67, 1, 2 }, 1053 { ahd_patch2_func, 67, 1, 2 },
1041 { ahd_patch0_func, 68, 1, 1 }, 1054 { ahd_patch0_func, 68, 1, 1 },
1042 { ahd_patch4_func, 116, 1, 1 }, 1055 { ahd_patch4_func, 115, 1, 1 },
1043 { ahd_patch2_func, 175, 3, 1 }, 1056 { ahd_patch2_func, 180, 3, 1 },
1044 { ahd_patch1_func, 178, 2, 1 }, 1057 { ahd_patch1_func, 183, 2, 1 },
1045 { ahd_patch5_func, 180, 1, 1 }, 1058 { ahd_patch5_func, 185, 1, 1 },
1046 { ahd_patch2_func, 189, 1, 2 }, 1059 { ahd_patch2_func, 194, 1, 2 },
1047 { ahd_patch0_func, 190, 1, 1 }, 1060 { ahd_patch0_func, 195, 1, 1 },
1048 { ahd_patch6_func, 191, 2, 2 }, 1061 { ahd_patch6_func, 196, 2, 2 },
1049 { ahd_patch0_func, 193, 6, 3 }, 1062 { ahd_patch0_func, 198, 6, 3 },
1050 { ahd_patch2_func, 196, 1, 2 }, 1063 { ahd_patch2_func, 201, 1, 2 },
1051 { ahd_patch0_func, 197, 1, 1 }, 1064 { ahd_patch0_func, 202, 1, 1 },
1052 { ahd_patch2_func, 200, 1, 2 }, 1065 { ahd_patch2_func, 205, 1, 2 },
1053 { ahd_patch0_func, 201, 1, 1 }, 1066 { ahd_patch0_func, 206, 1, 1 },
1054 { ahd_patch3_func, 203, 1, 1 }, 1067 { ahd_patch3_func, 208, 1, 1 },
1055 { ahd_patch7_func, 204, 3, 1 }, 1068 { ahd_patch7_func, 209, 3, 1 },
1056 { ahd_patch3_func, 213, 1, 1 }, 1069 { ahd_patch3_func, 218, 1, 1 },
1057 { ahd_patch5_func, 214, 16, 2 }, 1070 { ahd_patch5_func, 219, 16, 2 },
1058 { ahd_patch0_func, 230, 1, 1 }, 1071 { ahd_patch0_func, 235, 1, 1 },
1059 { ahd_patch8_func, 250, 2, 1 }, 1072 { ahd_patch8_func, 260, 2, 1 },
1060 { ahd_patch1_func, 254, 1, 2 }, 1073 { ahd_patch1_func, 264, 1, 2 },
1061 { ahd_patch0_func, 255, 1, 1 }, 1074 { ahd_patch0_func, 265, 1, 1 },
1062 { ahd_patch7_func, 258, 3, 1 }, 1075 { ahd_patch7_func, 268, 3, 1 },
1063 { ahd_patch1_func, 273, 1, 2 }, 1076 { ahd_patch1_func, 283, 1, 2 },
1064 { ahd_patch0_func, 274, 1, 1 }, 1077 { ahd_patch0_func, 284, 1, 1 },
1065 { ahd_patch1_func, 277, 1, 2 }, 1078 { ahd_patch1_func, 287, 1, 2 },
1066 { ahd_patch0_func, 278, 1, 1 }, 1079 { ahd_patch0_func, 288, 1, 1 },
1067 { ahd_patch2_func, 281, 1, 2 }, 1080 { ahd_patch2_func, 291, 1, 2 },
1068 { ahd_patch0_func, 282, 1, 1 }, 1081 { ahd_patch0_func, 292, 1, 1 },
1069 { ahd_patch9_func, 295, 2, 2 }, 1082 { ahd_patch9_func, 305, 2, 2 },
1070 { ahd_patch0_func, 297, 1, 1 }, 1083 { ahd_patch0_func, 307, 1, 1 },
1071 { ahd_patch1_func, 339, 1, 2 }, 1084 { ahd_patch1_func, 349, 1, 2 },
1072 { ahd_patch0_func, 340, 1, 1 }, 1085 { ahd_patch0_func, 350, 1, 1 },
1073 { ahd_patch2_func, 348, 1, 2 }, 1086 { ahd_patch2_func, 358, 1, 2 },
1074 { ahd_patch0_func, 349, 1, 1 }, 1087 { ahd_patch0_func, 359, 1, 1 },
1075 { ahd_patch2_func, 352, 1, 2 }, 1088 { ahd_patch2_func, 362, 1, 2 },
1076 { ahd_patch0_func, 353, 1, 1 },
1077 { ahd_patch1_func, 359, 1, 2 },
1078 { ahd_patch0_func, 360, 1, 1 },
1079 { ahd_patch1_func, 362, 1, 2 },
1080 { ahd_patch0_func, 363, 1, 1 }, 1089 { ahd_patch0_func, 363, 1, 1 },
1081 { ahd_patch10_func, 382, 1, 1 }, 1090 { ahd_patch1_func, 369, 1, 2 },
1082 { ahd_patch10_func, 385, 1, 1 }, 1091 { ahd_patch0_func, 370, 1, 1 },
1083 { ahd_patch10_func, 387, 1, 1 }, 1092 { ahd_patch1_func, 372, 1, 2 },
1084 { ahd_patch10_func, 399, 1, 1 }, 1093 { ahd_patch0_func, 373, 1, 1 },
1085 { ahd_patch1_func, 409, 1, 2 }, 1094 { ahd_patch10_func, 392, 1, 1 },
1086 { ahd_patch0_func, 410, 1, 1 }, 1095 { ahd_patch10_func, 395, 1, 1 },
1087 { ahd_patch1_func, 412, 1, 2 }, 1096 { ahd_patch10_func, 397, 1, 1 },
1088 { ahd_patch0_func, 413, 1, 1 }, 1097 { ahd_patch10_func, 409, 1, 1 },
1089 { ahd_patch1_func, 421, 1, 2 }, 1098 { ahd_patch1_func, 419, 1, 2 },
1090 { ahd_patch0_func, 422, 1, 1 }, 1099 { ahd_patch0_func, 420, 1, 1 },
1091 { ahd_patch2_func, 435, 1, 2 }, 1100 { ahd_patch1_func, 422, 1, 2 },
1092 { ahd_patch0_func, 436, 1, 1 }, 1101 { ahd_patch0_func, 423, 1, 1 },
1093 { ahd_patch11_func, 472, 1, 1 }, 1102 { ahd_patch1_func, 431, 1, 2 },
1094 { ahd_patch1_func, 480, 1, 2 }, 1103 { ahd_patch0_func, 432, 1, 1 },
1095 { ahd_patch0_func, 481, 1, 1 }, 1104 { ahd_patch2_func, 445, 1, 2 },
1096 { ahd_patch2_func, 493, 1, 2 }, 1105 { ahd_patch0_func, 446, 1, 1 },
1097 { ahd_patch0_func, 494, 1, 1 }, 1106 { ahd_patch11_func, 482, 1, 1 },
1098 { ahd_patch12_func, 497, 6, 2 }, 1107 { ahd_patch1_func, 490, 1, 2 },
1099 { ahd_patch0_func, 503, 1, 1 }, 1108 { ahd_patch0_func, 491, 1, 1 },
1100 { ahd_patch13_func, 524, 7, 1 }, 1109 { ahd_patch2_func, 503, 1, 2 },
1101 { ahd_patch14_func, 533, 1, 1 }, 1110 { ahd_patch0_func, 504, 1, 1 },
1102 { ahd_patch15_func, 542, 1, 1 }, 1111 { ahd_patch12_func, 507, 6, 2 },
1103 { ahd_patch16_func, 543, 1, 2 }, 1112 { ahd_patch0_func, 513, 1, 1 },
1104 { ahd_patch0_func, 544, 1, 1 }, 1113 { ahd_patch13_func, 534, 7, 1 },
1105 { ahd_patch17_func, 547, 1, 1 }, 1114 { ahd_patch14_func, 543, 1, 1 },
1106 { ahd_patch16_func, 548, 1, 1 }, 1115 { ahd_patch15_func, 552, 1, 1 },
1107 { ahd_patch18_func, 559, 1, 2 }, 1116 { ahd_patch16_func, 553, 1, 2 },
1108 { ahd_patch0_func, 560, 1, 1 }, 1117 { ahd_patch0_func, 554, 1, 1 },
1109 { ahd_patch1_func, 579, 1, 2 }, 1118 { ahd_patch17_func, 557, 1, 1 },
1110 { ahd_patch0_func, 580, 1, 1 }, 1119 { ahd_patch16_func, 558, 1, 1 },
1111 { ahd_patch1_func, 583, 1, 2 }, 1120 { ahd_patch18_func, 569, 1, 2 },
1112 { ahd_patch0_func, 584, 1, 1 }, 1121 { ahd_patch0_func, 570, 1, 1 },
1113 { ahd_patch2_func, 589, 1, 2 }, 1122 { ahd_patch1_func, 589, 1, 2 },
1114 { ahd_patch0_func, 590, 1, 1 }, 1123 { ahd_patch0_func, 590, 1, 1 },
1115 { ahd_patch2_func, 594, 1, 2 }, 1124 { ahd_patch1_func, 593, 1, 2 },
1116 { ahd_patch0_func, 595, 1, 1 }, 1125 { ahd_patch0_func, 594, 1, 1 },
1117 { ahd_patch1_func, 596, 1, 2 }, 1126 { ahd_patch2_func, 599, 1, 2 },
1118 { ahd_patch0_func, 597, 1, 1 }, 1127 { ahd_patch0_func, 600, 1, 1 },
1119 { ahd_patch2_func, 608, 1, 2 }, 1128 { ahd_patch2_func, 604, 1, 2 },
1120 { ahd_patch0_func, 609, 1, 1 }, 1129 { ahd_patch0_func, 605, 1, 1 },
1121 { ahd_patch19_func, 613, 1, 1 }, 1130 { ahd_patch1_func, 606, 1, 2 },
1122 { ahd_patch20_func, 618, 1, 1 }, 1131 { ahd_patch0_func, 607, 1, 1 },
1123 { ahd_patch21_func, 619, 2, 1 }, 1132 { ahd_patch2_func, 618, 1, 2 },
1124 { ahd_patch20_func, 623, 1, 2 }, 1133 { ahd_patch0_func, 619, 1, 1 },
1125 { ahd_patch0_func, 624, 1, 1 }, 1134 { ahd_patch19_func, 623, 1, 1 },
1126 { ahd_patch2_func, 627, 1, 2 }, 1135 { ahd_patch20_func, 628, 1, 1 },
1127 { ahd_patch0_func, 628, 1, 1 }, 1136 { ahd_patch21_func, 629, 2, 1 },
1128 { ahd_patch2_func, 643, 1, 2 }, 1137 { ahd_patch20_func, 633, 1, 2 },
1129 { ahd_patch0_func, 644, 1, 1 }, 1138 { ahd_patch0_func, 634, 1, 1 },
1130 { ahd_patch13_func, 645, 14, 1 }, 1139 { ahd_patch2_func, 637, 1, 2 },
1131 { ahd_patch1_func, 663, 1, 2 }, 1140 { ahd_patch0_func, 638, 1, 1 },
1132 { ahd_patch0_func, 664, 1, 1 }, 1141 { ahd_patch2_func, 653, 1, 2 },
1133 { ahd_patch13_func, 665, 1, 1 }, 1142 { ahd_patch0_func, 654, 1, 1 },
1134 { ahd_patch1_func, 677, 1, 2 }, 1143 { ahd_patch13_func, 655, 14, 1 },
1135 { ahd_patch0_func, 678, 1, 1 }, 1144 { ahd_patch1_func, 673, 1, 2 },
1136 { ahd_patch1_func, 685, 1, 2 }, 1145 { ahd_patch0_func, 674, 1, 1 },
1137 { ahd_patch0_func, 686, 1, 1 }, 1146 { ahd_patch13_func, 675, 1, 1 },
1138 { ahd_patch19_func, 709, 1, 1 }, 1147 { ahd_patch1_func, 687, 1, 2 },
1139 { ahd_patch19_func, 747, 1, 1 }, 1148 { ahd_patch0_func, 688, 1, 1 },
1140 { ahd_patch1_func, 758, 1, 2 }, 1149 { ahd_patch1_func, 695, 1, 2 },
1141 { ahd_patch0_func, 759, 1, 1 }, 1150 { ahd_patch0_func, 696, 1, 1 },
1142 { ahd_patch1_func, 776, 1, 2 }, 1151 { ahd_patch19_func, 719, 1, 1 },
1143 { ahd_patch0_func, 777, 1, 1 }, 1152 { ahd_patch19_func, 757, 1, 1 },
1144 { ahd_patch1_func, 779, 1, 2 }, 1153 { ahd_patch1_func, 768, 1, 2 },
1145 { ahd_patch0_func, 780, 1, 1 }, 1154 { ahd_patch0_func, 769, 1, 1 },
1146 { ahd_patch1_func, 783, 1, 2 }, 1155 { ahd_patch7_func, 785, 3, 1 },
1147 { ahd_patch0_func, 784, 1, 1 }, 1156 { ahd_patch1_func, 789, 1, 2 },
1148 { ahd_patch22_func, 786, 1, 2 }, 1157 { ahd_patch0_func, 790, 1, 1 },
1149 { ahd_patch0_func, 787, 2, 1 }, 1158 { ahd_patch1_func, 792, 1, 2 },
1150 { ahd_patch23_func, 790, 4, 2 }, 1159 { ahd_patch0_func, 793, 1, 1 },
1151 { ahd_patch0_func, 794, 1, 1 }, 1160 { ahd_patch1_func, 796, 1, 2 },
1152 { ahd_patch23_func, 802, 11, 1 } 1161 { ahd_patch0_func, 797, 1, 1 },
1162 { ahd_patch22_func, 799, 1, 2 },
1163 { ahd_patch0_func, 800, 2, 1 },
1164 { ahd_patch23_func, 803, 4, 2 },
1165 { ahd_patch0_func, 807, 1, 1 },
1166 { ahd_patch23_func, 815, 11, 1 }
1153}; 1167};
1154 1168
1155static struct cs { 1169static struct cs {
1156 uint16_t begin; 1170 uint16_t begin;
1157 uint16_t end; 1171 uint16_t end;
1158} critical_sections[] = { 1172} critical_sections[] = {
1159 { 17, 28 }, 1173 { 17, 30 },
1160 { 29, 30 },
1161 { 47, 58 }, 1174 { 47, 58 },
1162 { 61, 63 }, 1175 { 61, 63 },
1163 { 65, 66 }, 1176 { 65, 66 },
1164 { 72, 92 }, 1177 { 72, 92 },
1165 { 110, 137 }, 1178 { 110, 142 },
1166 { 138, 175 }, 1179 { 143, 180 },
1167 { 180, 188 }, 1180 { 185, 193 },
1168 { 213, 264 }, 1181 { 218, 274 },
1169 { 425, 433 }, 1182 { 435, 443 },
1170 { 443, 445 }, 1183 { 453, 455 },
1171 { 448, 457 }, 1184 { 458, 467 },
1172 { 709, 739 }, 1185 { 719, 749 },
1173 { 749, 753 } 1186 { 759, 763 }
1174}; 1187};
1175 1188
1176static const int num_critical_sections = sizeof(critical_sections) 1189static const int num_critical_sections = sizeof(critical_sections)
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm.c b/drivers/scsi/aic7xxx/aicasm/aicasm.c
index f936b691232f..924102720b14 100644
--- a/drivers/scsi/aic7xxx/aicasm/aicasm.c
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm.c
@@ -37,7 +37,7 @@
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES. 38 * POSSIBILITY OF SUCH DAMAGES.
39 * 39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#22 $ 40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#23 $
41 * 41 *
42 * $FreeBSD$ 42 * $FreeBSD$
43 */ 43 */
@@ -609,10 +609,10 @@ output_listing(char *ifilename)
609 609
610 while (line < cur_instr->srcline) { 610 while (line < cur_instr->srcline) {
611 fgets(buf, sizeof(buf), ifile); 611 fgets(buf, sizeof(buf), ifile);
612 fprintf(listfile, "\t\t%s", buf); 612 fprintf(listfile, " \t%s", buf);
613 line++; 613 line++;
614 } 614 }
615 fprintf(listfile, "%03x %02x%02x%02x%02x", instrptr, 615 fprintf(listfile, "%04x %02x%02x%02x%02x", instrptr,
616#ifdef __LITTLE_ENDIAN 616#ifdef __LITTLE_ENDIAN
617 cur_instr->format.bytes[0], 617 cur_instr->format.bytes[0],
618 cur_instr->format.bytes[1], 618 cur_instr->format.bytes[1],
@@ -624,14 +624,23 @@ output_listing(char *ifilename)
624 cur_instr->format.bytes[1], 624 cur_instr->format.bytes[1],
625 cur_instr->format.bytes[0]); 625 cur_instr->format.bytes[0]);
626#endif 626#endif
627 fgets(buf, sizeof(buf), ifile); 627 /*
628 fprintf(listfile, "\t%s", buf); 628 * Macro expansions can cause several instructions
629 line++; 629 * to be output for a single source line. Only
630 * advance the line once in these cases.
631 */
632 if (line == cur_instr->srcline) {
633 fgets(buf, sizeof(buf), ifile);
634 fprintf(listfile, "\t%s", buf);
635 line++;
636 } else {
637 fprintf(listfile, "\n");
638 }
630 instrptr++; 639 instrptr++;
631 } 640 }
632 /* Dump the remainder of the file */ 641 /* Dump the remainder of the file */
633 while(fgets(buf, sizeof(buf), ifile) != NULL) 642 while(fgets(buf, sizeof(buf), ifile) != NULL)
634 fprintf(listfile, "\t\t%s", buf); 643 fprintf(listfile, " %s", buf);
635 644
636 fclose(ifile); 645 fclose(ifile);
637} 646}
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
index 67e046d96625..c328596def3c 100644
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
@@ -38,7 +38,7 @@
38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 * POSSIBILITY OF SUCH DAMAGES. 39 * POSSIBILITY OF SUCH DAMAGES.
40 * 40 *
41 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#29 $ 41 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#30 $
42 * 42 *
43 * $FreeBSD$ 43 * $FreeBSD$
44 */ 44 */
@@ -157,6 +157,8 @@ static int is_download_const(expression_t *immed);
157 157
158%token T_END_CS 158%token T_END_CS
159 159
160%token T_PAD_PAGE
161
160%token T_FIELD 162%token T_FIELD
161 163
162%token T_ENUM 164%token T_ENUM
@@ -189,6 +191,10 @@ static int is_download_const(expression_t *immed);
189 191
190%token <value> T_OR 192%token <value> T_OR
191 193
194/* 16 bit extensions */
195%token <value> T_OR16 T_AND16 T_XOR16 T_ADD16
196%token <value> T_ADC16 T_MVI16 T_TEST16 T_CMP16 T_CMPXCHG
197
192%token T_RET 198%token T_RET
193 199
194%token T_NOP 200%token T_NOP
@@ -207,7 +213,7 @@ static int is_download_const(expression_t *immed);
207 213
208%type <expression> expression immediate immediate_or_a 214%type <expression> expression immediate immediate_or_a
209 215
210%type <value> export ret f1_opcode f2_opcode jmp_jc_jnc_call jz_jnz je_jne 216%type <value> export ret f1_opcode f2_opcode f4_opcode jmp_jc_jnc_call jz_jnz je_jne
211 217
212%type <value> mode_value mode_list macro_arglist 218%type <value> mode_value mode_list macro_arglist
213 219
@@ -1304,6 +1310,15 @@ f2_opcode:
1304| T_ROR { $$ = AIC_OP_ROR; } 1310| T_ROR { $$ = AIC_OP_ROR; }
1305; 1311;
1306 1312
1313f4_opcode:
1314 T_OR16 { $$ = AIC_OP_OR16; }
1315| T_AND16 { $$ = AIC_OP_AND16; }
1316| T_XOR16 { $$ = AIC_OP_XOR16; }
1317| T_ADD16 { $$ = AIC_OP_ADD16; }
1318| T_ADC16 { $$ = AIC_OP_ADC16; }
1319| T_MVI16 { $$ = AIC_OP_MVI16; }
1320;
1321
1307code: 1322code:
1308 f2_opcode destination ',' expression opt_source ret ';' 1323 f2_opcode destination ',' expression opt_source ret ';'
1309 { 1324 {
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h b/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h
index e64f802bbaaa..9df9e2ce3538 100644
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h
@@ -37,13 +37,14 @@
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES. 38 * POSSIBILITY OF SUCH DAMAGES.
39 * 39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#11 $ 40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#12 $
41 * 41 *
42 * $FreeBSD$ 42 * $FreeBSD$
43 */ 43 */
44 44
45#include <asm/byteorder.h> 45#include <asm/byteorder.h>
46 46
47/* 8bit ALU logic operations */
47struct ins_format1 { 48struct ins_format1 {
48#ifdef __LITTLE_ENDIAN 49#ifdef __LITTLE_ENDIAN
49 uint32_t immediate : 8, 50 uint32_t immediate : 8,
@@ -62,6 +63,7 @@ struct ins_format1 {
62#endif 63#endif
63}; 64};
64 65
66/* 8bit ALU shift/rotate operations */
65struct ins_format2 { 67struct ins_format2 {
66#ifdef __LITTLE_ENDIAN 68#ifdef __LITTLE_ENDIAN
67 uint32_t shift_control : 8, 69 uint32_t shift_control : 8,
@@ -80,6 +82,7 @@ struct ins_format2 {
80#endif 82#endif
81}; 83};
82 84
85/* 8bit branch control operations */
83struct ins_format3 { 86struct ins_format3 {
84#ifdef __LITTLE_ENDIAN 87#ifdef __LITTLE_ENDIAN
85 uint32_t immediate : 8, 88 uint32_t immediate : 8,
@@ -96,10 +99,68 @@ struct ins_format3 {
96#endif 99#endif
97}; 100};
98 101
102/* 16bit ALU logic operations */
103struct ins_format4 {
104#ifdef __LITTLE_ENDIAN
105 uint32_t opcode_ext : 8,
106 source : 9,
107 destination : 9,
108 ret : 1,
109 opcode : 4,
110 parity : 1;
111#else
112 uint32_t parity : 1,
113 opcode : 4,
114 ret : 1,
115 destination : 9,
116 source : 9,
117 opcode_ext : 8;
118#endif
119};
120
121/* 16bit branch control operations */
122struct ins_format5 {
123#ifdef __LITTLE_ENDIAN
124 uint32_t opcode_ext : 8,
125 source : 9,
126 address : 10,
127 opcode : 4,
128 parity : 1;
129#else
130 uint32_t parity : 1,
131 opcode : 4,
132 address : 10,
133 source : 9,
134 opcode_ext : 8;
135#endif
136};
137
138/* Far branch operations */
139struct ins_format6 {
140#ifdef __LITTLE_ENDIAN
141 uint32_t page : 3,
142 opcode_ext : 5,
143 source : 9,
144 address : 10,
145 opcode : 4,
146 parity : 1;
147#else
148 uint32_t parity : 1,
149 opcode : 4,
150 address : 10,
151 source : 9,
152 opcode_ext : 5,
153 page : 3;
154#endif
155};
156
99union ins_formats { 157union ins_formats {
100 struct ins_format1 format1; 158 struct ins_format1 format1;
101 struct ins_format2 format2; 159 struct ins_format2 format2;
102 struct ins_format3 format3; 160 struct ins_format3 format3;
161 struct ins_format4 format4;
162 struct ins_format5 format5;
163 struct ins_format6 format6;
103 uint8_t bytes[4]; 164 uint8_t bytes[4];
104 uint32_t integer; 165 uint32_t integer;
105}; 166};
@@ -118,6 +179,8 @@ struct instruction {
118#define AIC_OP_ROL 0x5 179#define AIC_OP_ROL 0x5
119#define AIC_OP_BMOV 0x6 180#define AIC_OP_BMOV 0x6
120 181
182#define AIC_OP_MVI16 0x7
183
121#define AIC_OP_JMP 0x8 184#define AIC_OP_JMP 0x8
122#define AIC_OP_JC 0x9 185#define AIC_OP_JC 0x9
123#define AIC_OP_JNC 0xa 186#define AIC_OP_JNC 0xa
@@ -131,3 +194,26 @@ struct instruction {
131#define AIC_OP_SHL 0x10 194#define AIC_OP_SHL 0x10
132#define AIC_OP_SHR 0x20 195#define AIC_OP_SHR 0x20
133#define AIC_OP_ROR 0x30 196#define AIC_OP_ROR 0x30
197
198/* 16bit Ops. Low byte main opcode. High byte extended opcode. */
199#define AIC_OP_OR16 0x8005
200#define AIC_OP_AND16 0x8105
201#define AIC_OP_XOR16 0x8205
202#define AIC_OP_ADD16 0x8305
203#define AIC_OP_ADC16 0x8405
204#define AIC_OP_JNE16 0x8805
205#define AIC_OP_JNZ16 0x8905
206#define AIC_OP_JE16 0x8C05
207#define AIC_OP_JZ16 0x8B05
208#define AIC_OP_JMP16 0x9005
209#define AIC_OP_JC16 0x9105
210#define AIC_OP_JNC16 0x9205
211#define AIC_OP_CALL16 0x9305
212#define AIC_OP_CALL16 0x9305
213
214/* Page extension is low three bits of second opcode byte. */
215#define AIC_OP_JMPF 0xA005
216#define AIC_OP_CALLF 0xB005
217#define AIC_OP_JCF 0xC005
218#define AIC_OP_JNCF 0xD005
219#define AIC_OP_CMPXCHG 0xE005
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
index 45c0b233d0bc..7c3983f868a9 100644
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
@@ -38,7 +38,7 @@
38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 * POSSIBILITY OF SUCH DAMAGES. 39 * POSSIBILITY OF SUCH DAMAGES.
40 * 40 *
41 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#19 $ 41 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#20 $
42 * 42 *
43 * $FreeBSD$ 43 * $FreeBSD$
44 */ 44 */
@@ -132,7 +132,7 @@ if[ \t]*\( {
132 *string_buf_ptr++ = *yptr++; 132 *string_buf_ptr++ = *yptr++;
133 } 133 }
134 } 134 }
135 135else { return T_ELSE; }
136VERSION { return T_VERSION; } 136VERSION { return T_VERSION; }
137PREFIX { return T_PREFIX; } 137PREFIX { return T_PREFIX; }
138PATCH_ARG_LIST { return T_PATCH_ARG_LIST; } 138PATCH_ARG_LIST { return T_PATCH_ARG_LIST; }
@@ -173,10 +173,6 @@ RW|RO|WO {
173 yylval.value = WO; 173 yylval.value = WO;
174 return T_MODE; 174 return T_MODE;
175 } 175 }
176BEGIN_CRITICAL { return T_BEGIN_CS; }
177END_CRITICAL { return T_END_CS; }
178SET_SRC_MODE { return T_SET_SRC_MODE; }
179SET_DST_MODE { return T_SET_DST_MODE; }
180field { return T_FIELD; } 176field { return T_FIELD; }
181enum { return T_ENUM; } 177enum { return T_ENUM; }
182mask { return T_MASK; } 178mask { return T_MASK; }
@@ -192,6 +188,13 @@ none { return T_NONE; }
192sindex { return T_SINDEX; } 188sindex { return T_SINDEX; }
193A { return T_A; } 189A { return T_A; }
194 190
191 /* Instruction Formatting */
192PAD_PAGE { return T_PAD_PAGE; }
193BEGIN_CRITICAL { return T_BEGIN_CS; }
194END_CRITICAL { return T_END_CS; }
195SET_SRC_MODE { return T_SET_SRC_MODE; }
196SET_DST_MODE { return T_SET_DST_MODE; }
197
195 /* Opcodes */ 198 /* Opcodes */
196shl { return T_SHL; } 199shl { return T_SHL; }
197shr { return T_SHR; } 200shr { return T_SHR; }
@@ -223,7 +226,17 @@ and { return T_AND; }
223or { return T_OR; } 226or { return T_OR; }
224ret { return T_RET; } 227ret { return T_RET; }
225nop { return T_NOP; } 228nop { return T_NOP; }
226else { return T_ELSE; } 229
230 /* ARP2 16bit extensions */
231or16 { return T_OR16; }
232and16 { return T_AND16; }
233xor16 { return T_XOR16; }
234add16 { return T_ADD16; }
235adc16 { return T_ADC16; }
236mvi16 { return T_MVI16; }
237test16 { return T_TEST16; }
238cmp16 { return T_CMP16; }
239cmpxchg { return T_CMPXCHG; }
227 240
228 /* Allowed Symbols */ 241 /* Allowed Symbols */
229\<\< { return T_EXPR_LSHIFT; } 242\<\< { return T_EXPR_LSHIFT; }