Commit d8433379 authored by Justin T. Gibbs's avatar Justin T. Gibbs

Update to aic7xxx version 6.2.24 and aic79xx version 1.3.0_ALPHA5.

parent f211e1fd
# #
# Makefile for the Linux aic7xxx SCSI driver. # Makefile for the Linux aic7xxx SCSI driver.
# #
# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#2 $ # $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#3 $
# #
# Let kbuild descend into aicasm when cleaning # Let kbuild descend into aicasm when cleaning
...@@ -53,7 +53,7 @@ aic7xxx_gen = $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_reg.h ...@@ -53,7 +53,7 @@ aic7xxx_gen = $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_reg.h
ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y) ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
aic7xxx_gen += $(obj)/aic7xxx_reg_print.c aic7xxx_gen += $(obj)/aic7xxx_reg_print.c
aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \ aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
-p aic7xxx_reg_print.c -i aic7xxx_osm.h \ -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h \
-o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq
else else
aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \ aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
...@@ -69,7 +69,7 @@ aic79xx_gen = $(obj)/aic79xx_seq.h $(obj)/aic79xx_reg.h ...@@ -69,7 +69,7 @@ aic79xx_gen = $(obj)/aic79xx_seq.h $(obj)/aic79xx_reg.h
ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y) ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
aic79xx_gen += $(obj)/aic79xx_reg_print.c aic79xx_gen += $(obj)/aic79xx_reg_print.c
aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \ aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
-p aic79xx_reg_print.c -i aic79xx_osm.h \ -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h \
-o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq -o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq
else else
aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \ aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#76 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#78 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -356,7 +356,9 @@ typedef enum { ...@@ -356,7 +356,9 @@ typedef enum {
AHD_CURRENT_SENSING = 0x40000, AHD_CURRENT_SENSING = 0x40000,
AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */ AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */
AHD_HP_BOARD = 0x100000, AHD_HP_BOARD = 0x100000,
AHD_RESET_POLL_ACTIVE = 0x200000 AHD_RESET_POLL_ACTIVE = 0x200000,
AHD_UPDATE_PEND_CMDS = 0x400000,
AHD_RUNNING_QOUTFIFO = 0x800000
} ahd_flag; } ahd_flag;
/************************* Hardware SCB Definition ***************************/ /************************* Hardware SCB Definition ***************************/
...@@ -1063,6 +1065,16 @@ struct ahd_softc { ...@@ -1063,6 +1065,16 @@ struct ahd_softc {
* Timer handles for timer driven callbacks. * Timer handles for timer driven callbacks.
*/ */
ahd_timer_t reset_timer; ahd_timer_t reset_timer;
ahd_timer_t stat_timer;
/*
* Statistics.
*/
#define AHD_STAT_UPDATE_US 250000 /* 250ms */
#define AHD_STAT_BUCKETS 4
u_int cmdcmplt_bucket;
uint32_t cmdcmplt_counts[AHD_STAT_BUCKETS];
uint32_t cmdcmplt_total;
/* /*
* Card characteristics * Card characteristics
...@@ -1106,6 +1118,12 @@ struct ahd_softc { ...@@ -1106,6 +1118,12 @@ struct ahd_softc {
struct target_cmd *targetcmds; struct target_cmd *targetcmds;
uint8_t tqinfifonext; uint8_t tqinfifonext;
/*
* Cached verson of the hs_mailbox so we can avoid
* pausing the sequencer during mailbox updates.
*/
uint8_t hs_mailbox;
/* /*
* Incoming and outgoing message handling. * Incoming and outgoing message handling.
*/ */
...@@ -1154,6 +1172,22 @@ struct ahd_softc { ...@@ -1154,6 +1172,22 @@ struct ahd_softc {
/* Selection Timer settings */ /* Selection Timer settings */
int seltime; int seltime;
/*
* Interrupt coalessing settings.
*/
#define AHD_INT_COALESSING_TIMER_DEFAULT 250 /*us*/
#define AHD_INT_COALESSING_MAXCMDS_DEFAULT 10
#define AHD_INT_COALESSING_MAXCMDS_MAX 127
#define AHD_INT_COALESSING_MINCMDS_DEFAULT 5
#define AHD_INT_COALESSING_MINCMDS_MAX 127
#define AHD_INT_COALESSING_THRESHOLD_DEFAULT 2000
#define AHD_INT_COALESSING_STOP_THRESHOLD_DEFAULT 1000
u_int int_coalessing_timer;
u_int int_coalessing_maxcmds;
u_int int_coalessing_mincmds;
u_int int_coalessing_threshold;
u_int int_coalessing_stop_threshold;
uint16_t user_discenable;/* Disconnection allowed */ uint16_t user_discenable;/* Disconnection allowed */
uint16_t user_tagenable;/* Tagged Queuing allowed */ uint16_t user_tagenable;/* Tagged Queuing allowed */
}; };
...@@ -1240,6 +1274,7 @@ extern const int ahd_num_aic7770_devs; ...@@ -1240,6 +1274,7 @@ extern const int ahd_num_aic7770_devs;
/*************************** Function Declarations ****************************/ /*************************** Function Declarations ****************************/
/******************************************************************************/ /******************************************************************************/
void ahd_reset_cmds_pending(struct ahd_softc *ahd);
u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl); u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
void ahd_busy_tcl(struct ahd_softc *ahd, void ahd_busy_tcl(struct ahd_softc *ahd,
u_int tcl, u_int busyid); u_int tcl, u_int busyid);
...@@ -1273,6 +1308,12 @@ int ahd_default_config(struct ahd_softc *ahd); ...@@ -1273,6 +1308,12 @@ int ahd_default_config(struct ahd_softc *ahd);
int ahd_parse_cfgdata(struct ahd_softc *ahd, int ahd_parse_cfgdata(struct ahd_softc *ahd,
struct seeprom_config *sc); struct seeprom_config *sc);
void ahd_intr_enable(struct ahd_softc *ahd, int enable); void ahd_intr_enable(struct ahd_softc *ahd, int enable);
void ahd_update_coalessing_values(struct ahd_softc *ahd,
u_int timer,
u_int maxcmds,
u_int mincmds);
void ahd_enable_coalessing(struct ahd_softc *ahd,
int enable);
void ahd_pause_and_flushwork(struct ahd_softc *ahd); void ahd_pause_and_flushwork(struct ahd_softc *ahd);
int ahd_suspend(struct ahd_softc *ahd); int ahd_suspend(struct ahd_softc *ahd);
int ahd_resume(struct ahd_softc *ahd); int ahd_resume(struct ahd_softc *ahd);
...@@ -1295,6 +1336,7 @@ int ahd_wait_flexport(struct ahd_softc *ahd); ...@@ -1295,6 +1336,7 @@ int ahd_wait_flexport(struct ahd_softc *ahd);
/*************************** Interrupt Services *******************************/ /*************************** Interrupt Services *******************************/
void ahd_pci_intr(struct ahd_softc *ahd); void ahd_pci_intr(struct ahd_softc *ahd);
void ahd_clear_intstat(struct ahd_softc *ahd); void ahd_clear_intstat(struct ahd_softc *ahd);
void ahd_flush_qoutfifo(struct ahd_softc *ahd);
void ahd_run_qoutfifo(struct ahd_softc *ahd); void ahd_run_qoutfifo(struct ahd_softc *ahd);
#ifdef AHD_TARGET_MODE #ifdef AHD_TARGET_MODE
void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused); void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused);
...@@ -1418,7 +1460,8 @@ extern uint32_t ahd_debug; ...@@ -1418,7 +1460,8 @@ extern uint32_t ahd_debug;
#define AHD_SHOW_QUEUE 0x02000 #define AHD_SHOW_QUEUE 0x02000
#define AHD_SHOW_TQIN 0x04000 #define AHD_SHOW_TQIN 0x04000
#define AHD_SHOW_SG 0x08000 #define AHD_SHOW_SG 0x08000
#define AHD_DEBUG_SEQUENCER 0x10000 #define AHD_SHOW_INT_COALESSING 0x10000
#define AHD_DEBUG_SEQUENCER 0x20000
#endif #endif
void ahd_print_scb(struct scb *scb); void ahd_print_scb(struct scb *scb);
void ahd_print_devinfo(struct ahd_softc *ahd, void ahd_print_devinfo(struct ahd_softc *ahd,
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* *
* $FreeBSD$ * $FreeBSD$
*/ */
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $" VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $"
/* /*
* This file is processed by the aic7xxx_asm utility for use in assembling * This file is processed by the aic7xxx_asm utility for use in assembling
...@@ -265,16 +265,17 @@ register HESCB_QOFF { ...@@ -265,16 +265,17 @@ register HESCB_QOFF {
* Host Mailbox * Host Mailbox
*/ */
register HS_MAILBOX { register HS_MAILBOX {
address 0x0B address 0x00B
access_mode RW access_mode RW
mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */ mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
mask ENINT_COALESS 0x40 /* Perform interrupt coalessing */
} }
/* /*
* Sequencer Interupt Status * Sequencer Interupt Status
*/ */
register SEQINTSTAT { register SEQINTSTAT {
address 0x0C address 0x00C
access_mode RO access_mode RO
field SEQ_SWTMRTO 0x10 field SEQ_SWTMRTO 0x10
field SEQ_SEQINT 0x08 field SEQ_SEQINT 0x08
...@@ -287,7 +288,7 @@ register SEQINTSTAT { ...@@ -287,7 +288,7 @@ register SEQINTSTAT {
* Clear SEQ Interrupt * Clear SEQ Interrupt
*/ */
register CLRSEQINTSTAT { register CLRSEQINTSTAT {
address 0x0C0 address 0x00C
access_mode WO access_mode WO
field CLRSEQ_SWTMRTO 0x10 field CLRSEQ_SWTMRTO 0x10
field CLRSEQ_SEQINT 0x08 field CLRSEQ_SEQINT 0x08
...@@ -300,7 +301,7 @@ register CLRSEQINTSTAT { ...@@ -300,7 +301,7 @@ register CLRSEQINTSTAT {
* Software Timer * Software Timer
*/ */
register SWTIMER { register SWTIMER {
address 0x0E0 address 0x00E
access_mode RW access_mode RW
size 2 size 2
} }
...@@ -3105,21 +3106,6 @@ register RCVRBIASCALC { ...@@ -3105,21 +3106,6 @@ register RCVRBIASCALC {
modes M_CFG modes M_CFG
} }
/*
* Data FIFO Debug Control
*/
register DFDBCTL {
address 0x0C8
access_mode RW
modes M_DFF0, M_DFF1
field DFF_CIO_WR_RDY 0x20
field DFF_CIO_RD_RDY 0x10
field DFF_DIR_ERR 0x08
field DFF_RAMBIST_FAIL 0x04
field DFF_RAMBIST_DONE 0x02
field DFF_RAMBIST_EN 0x01
}
/* /*
* Data FIFO Backup Read Pointer * Data FIFO Backup Read Pointer
* Contains the data FIFO address to be restored if the last * Contains the data FIFO address to be restored if the last
...@@ -3141,6 +3127,21 @@ register SKEWCALC { ...@@ -3141,6 +3127,21 @@ register SKEWCALC {
modes M_CFG modes M_CFG
} }
/*
* Data FIFO Debug Control
*/
register DFDBCTL {
address 0x0CB
access_mode RW
modes M_DFF0, M_DFF1
field DFF_CIO_WR_RDY 0x20
field DFF_CIO_RD_RDY 0x10
field DFF_DIR_ERR 0x08
field DFF_RAMBIST_FAIL 0x04
field DFF_RAMBIST_DONE 0x02
field DFF_RAMBIST_EN 0x01
}
/* /*
* Data FIFO Space Count * Data FIFO Space Count
* Number of FIFO locations that are free. * Number of FIFO locations that are free.
...@@ -3226,7 +3227,8 @@ register SEQINTCTL { ...@@ -3226,7 +3227,8 @@ register SEQINTCTL {
field INT1_CONTEXT 0x20 field INT1_CONTEXT 0x20
field SCS_SEQ_INT1M1 0x10 field SCS_SEQ_INT1M1 0x10
field SCS_SEQ_INT1M0 0x08 field SCS_SEQ_INT1M0 0x08
field INTMASK 0x06 field INTMASK2 0x04
field INTMASK1 0x02
field IRET 0x01 field IRET 0x01
} }
...@@ -3686,6 +3688,53 @@ scratch_ram { ...@@ -3686,6 +3688,53 @@ scratch_ram {
size 2 size 2
} }
/*
* The maximum amount of time to wait, when interrupt coalessing
* is enabled, before issueing a CMDCMPLT interrupt for a completed
* command.
*/
INT_COALESSING_TIMER {
size 2
}
/*
* The maximum number of commands to coaless into a single interrupt.
* Actually the 2's complement of that value to simplify sequencer
* code.
*/
INT_COALESSING_MAXCMDS {
size 1
}
/*
* The minimum number of commands still outstanding required
* to continue coalessing (2's compliment of value).
*/
INT_COALESSING_MINCMDS {
size 1
}
/*
* Number of commands "in-flight".
*/
CMDS_PENDING {
size 2
}
/*
* The count of commands that have been coalessed.
*/
INT_COALESSING_CMDCOUNT {
size 1
}
/*
* Since the HS_MAIBOX is self clearing, copy its contents to
* this position in scratch ram every time it changes.
*/
LOCAL_HS_MAILBOX {
size 1
}
/* /*
* Target-mode CDB type to CDB length table used * Target-mode CDB type to CDB length table used
* in non-packetized operation. * in non-packetized operation.
...@@ -3860,6 +3909,13 @@ const SCB_TRANSFER_SIZE_1BYTE_LUN 48 ...@@ -3860,6 +3909,13 @@ const SCB_TRANSFER_SIZE_1BYTE_LUN 48
/* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */ /* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */
const PKT_OVERRUN_BUFSIZE 512 const PKT_OVERRUN_BUFSIZE 512
/*
* Timer parameters.
*/
const AHD_TIMER_US_PER_TICK 25
const AHD_TIMER_MAX_TICKS 0xFFFF
const AHD_TIMER_MAX_US (AHD_TIMER_MAX_TICKS * AHD_TIMER_US_PER_TICK)
/* /*
* Downloaded (kernel inserted) constants * Downloaded (kernel inserted) constants
*/ */
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
* $FreeBSD$ * $FreeBSD$
*/ */
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $" VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $"
PATCH_ARG_LIST = "struct ahd_softc *ahd" PATCH_ARG_LIST = "struct ahd_softc *ahd"
PREFIX = "ahd_" PREFIX = "ahd_"
...@@ -164,6 +164,10 @@ idle_loop_next_fifo: ...@@ -164,6 +164,10 @@ idle_loop_next_fifo:
idle_loop_cchan: idle_loop_cchan:
SET_MODE(M_CCHAN, M_CCHAN) SET_MODE(M_CCHAN, M_CCHAN)
test QOFF_CTLSTA, HS_MAILBOX_ACT jz hs_mailbox_empty;
mov LOCAL_HS_MAILBOX, HS_MAILBOX;
or QOFF_CTLSTA, HS_MAILBOX_ACT;
hs_mailbox_empty:
BEGIN_CRITICAL; BEGIN_CRITICAL;
test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle; test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog; test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
...@@ -181,19 +185,65 @@ scbdma_tohost_done: ...@@ -181,19 +185,65 @@ scbdma_tohost_done:
and CCSCBCTL, ~(CCARREN|CCSCBEN) ret; and CCSCBCTL, ~(CCARREN|CCSCBEN) ret;
fill_qoutfifo_dmadone: fill_qoutfifo_dmadone:
and CCSCBCTL, ~(CCARREN|CCSCBEN); and CCSCBCTL, ~(CCARREN|CCSCBEN);
mvi INTSTAT, CMDCMPLT; call qoutfifo_updated;
mvi COMPLETE_SCB_DMAINPROG_HEAD[1], SCB_LIST_NULL; mvi COMPLETE_SCB_DMAINPROG_HEAD[1], SCB_LIST_NULL;
bmov QOUTFIFO_NEXT_ADDR, SCBHADDR, 4; bmov QOUTFIFO_NEXT_ADDR, SCBHADDR, 4;
test QOFF_CTLSTA, SDSCB_ROLLOVR jz return; test QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4; bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
xor QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret; xor QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret;
qoutfifo_updated:
/*
* If there are more commands waiting to be dma'ed
* to the host, always coaless. Otherwise honor the
* host's wishes.
*/
cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne coaless_by_count;
cmp COMPLETE_SCB_HEAD[1], SCB_LIST_NULL jne coaless_by_count;
test LOCAL_HS_MAILBOX, ENINT_COALESS jz issue_cmdcmplt;
/*
* If we have relatively few commands outstanding, don't
* bother waiting for another command to complete.
*/
test CMDS_PENDING[1], 0xFF jnz coaless_by_count;
/* Add -1 so that jnc means <= not just < */
add A, -1, INT_COALESSING_MINCMDS;
add NONE, A, CMDS_PENDING;
jnc issue_cmdcmplt;
/*
* If coalessing, only coaless up to the limit
* provided by the host driver.
*/
coaless_by_count:
mov A, INT_COALESSING_MAXCMDS;
add NONE, A, INT_COALESSING_CMDCOUNT;
jc issue_cmdcmplt;
/*
* If the timer is not currently active,
* fire it up.
*/
test INTCTL, SWTMINTMASK jz return;
bmov SWTIMER, INT_COALESSING_TIMER, 2;
mvi CLRSEQINTSTAT, CLRSEQ_SWTMRTO;
or INTCTL, SWTMINTEN|SWTIMER_START;
and INTCTL, ~SWTMINTMASK ret;
issue_cmdcmplt:
mvi INTSTAT, CMDCMPLT;
clr INT_COALESSING_CMDCOUNT;
or INTCTL, SWTMINTMASK ret;
BEGIN_CRITICAL; BEGIN_CRITICAL;
fetch_new_scb_inprog: fetch_new_scb_inprog:
test CCSCBCTL, ARRDONE jz return; test CCSCBCTL, ARRDONE jz return;
fetch_new_scb_done: fetch_new_scb_done:
and CCSCBCTL, ~(CCARREN|CCSCBEN); and CCSCBCTL, ~(CCARREN|CCSCBEN);
bmov REG0, SCBPTR, 2; bmov REG0, SCBPTR, 2;
clr A;
add CMDS_PENDING, 1;
adc CMDS_PENDING[1], A;
/* Update the next SCB address to download. */ /* Update the next SCB address to download. */
bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4; bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
mvi SCB_NEXT[1], SCB_LIST_NULL; mvi SCB_NEXT[1], SCB_LIST_NULL;
...@@ -229,7 +279,6 @@ scbdma_idle: ...@@ -229,7 +279,6 @@ scbdma_idle:
/* /*
* Give precedence to downloading new SCBs to execute * Give precedence to downloading new SCBs to execute
* unless select-outs are currently frozen. * unless select-outs are currently frozen.
* XXX Use a timer to prevent completion starvation.
*/ */
test SEQ_FLAGS2, SELECTOUT_QFROZEN jnz . + 2; test SEQ_FLAGS2, SELECTOUT_QFROZEN jnz . + 2;
BEGIN_CRITICAL; BEGIN_CRITICAL;
...@@ -251,6 +300,9 @@ fill_qoutfifo_loop: ...@@ -251,6 +300,9 @@ fill_qoutfifo_loop:
mov CCSCBRAM, SCBPTR; mov CCSCBRAM, SCBPTR;
or CCSCBRAM, A, SCBPTR[1]; or CCSCBRAM, A, SCBPTR[1];
mov NONE, SDSCB_QOFF; mov NONE, SDSCB_QOFF;
inc INT_COALESSING_CMDCOUNT;
add CMDS_PENDING, -1;
adc CMDS_PENDING[1], -1;
cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done; cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done;
cmp CCSCBADDR, CCSCBADDR_MAX je fill_qoutfifo_done; cmp CCSCBADDR, CCSCBADDR_MAX je fill_qoutfifo_done;
test QOFF_CTLSTA, SDSCB_ROLLOVR jnz fill_qoutfifo_done; test QOFF_CTLSTA, SDSCB_ROLLOVR jnz fill_qoutfifo_done;
...@@ -949,7 +1001,7 @@ complete_nomsg: ...@@ -949,7 +1001,7 @@ complete_nomsg:
freeze_queue: freeze_queue:
/* Cancel any pending select-out. */ /* Cancel any pending select-out. */
test SSTAT0, SELDO jnz . + 2; test SSTAT0, SELDO|SELINGO jnz . + 2;
and SCSISEQ0, ~ENSELO; and SCSISEQ0, ~ENSELO;
mov ACCUM_SAVE, A; mov ACCUM_SAVE, A;
clr A; clr A;
...@@ -1484,11 +1536,28 @@ sgptr_fixup_done: ...@@ -1484,11 +1536,28 @@ sgptr_fixup_done:
clr SCB_RESIDUAL_DATACNT[3]; /* We are not the last seg */ clr SCB_RESIDUAL_DATACNT[3]; /* We are not the last seg */
bmov SCB_RESIDUAL_DATACNT, SHCNT, 3 ret; bmov SCB_RESIDUAL_DATACNT, SHCNT, 3 ret;
export timer_isr:
call issue_cmdcmplt;
mvi CLRSEQINTSTAT, CLRSEQ_SWTMRTO;
if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {
/*
* In H2A4, the mode pointer is not saved
* for intvec2, but is restored on iret.
* This can lead to the restoration of a
* bogus mode ptr. Manually clear the
* intmask bits and do a normal return
* to compensate.
*/
and SEQINTCTL, ~(INTMASK2|INTMASK1) ret;
} else {
or SEQINTCTL, IRET ret;
}
export seq_isr: export seq_isr:
nop; /* Jumps in the first ISR instruction fail on Rev A. */ nop; /* Jumps in the first ISR instruction fail on Rev A. */
test SEQINTSRC, SAVEPTRS jnz saveptr_intr;
test SEQINTSRC, CFG4DATA jnz cfg4data_intr; test SEQINTSRC, CFG4DATA jnz cfg4data_intr;
test SEQINTSRC, CFG4ISTAT jnz cfg4istat_intr; test SEQINTSRC, CFG4ISTAT jnz cfg4istat_intr;
test SEQINTSRC, SAVEPTRS jnz saveptr_intr;
test SEQINTSRC, CFG4ICMD jnz cfg4icmd_intr; test SEQINTSRC, CFG4ICMD jnz cfg4icmd_intr;
SET_SEQINTCODE(INVALID_SEQINT) SET_SEQINTCODE(INVALID_SEQINT)
...@@ -1793,7 +1862,7 @@ load_overrun_buf: ...@@ -1793,7 +1862,7 @@ load_overrun_buf:
/* PKT_OVERRUN_BUFSIZE is a multiple of 256 */ /* PKT_OVERRUN_BUFSIZE is a multiple of 256 */
clr HCNT[0]; clr HCNT[0];
mvi HCNT[1], ((PKT_OVERRUN_BUFSIZE >> 8) & 0xFF); mvi HCNT[1], ((PKT_OVERRUN_BUFSIZE >> 8) & 0xFF);
clr HCNT[2]; clr HCNT[2] ret;
} }
cfg4icmd_intr: cfg4icmd_intr:
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#143 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#147 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -211,6 +211,7 @@ static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid, ...@@ -211,6 +211,7 @@ static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid,
u_int prev, u_int next, u_int tid); u_int prev, u_int next, u_int tid);
static void ahd_reset_current_bus(struct ahd_softc *ahd); static void ahd_reset_current_bus(struct ahd_softc *ahd);
static ahd_callback_t ahd_reset_poll; static ahd_callback_t ahd_reset_poll;
static ahd_callback_t ahd_stat_timer;
#ifdef AHD_DUMP_SEQ #ifdef AHD_DUMP_SEQ
static void ahd_dumpseq(struct ahd_softc *ahd); static void ahd_dumpseq(struct ahd_softc *ahd);
#endif #endif
...@@ -282,7 +283,6 @@ ahd_set_active_fifo(struct ahd_softc *ahd) ...@@ -282,7 +283,6 @@ ahd_set_active_fifo(struct ahd_softc *ahd)
AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
active_fifo = ahd_inb(ahd, DFFSTAT) & CURRFIFO; active_fifo = ahd_inb(ahd, DFFSTAT) & CURRFIFO;
/* XXX This is a three possition switch in the B. */
switch (active_fifo) { switch (active_fifo) {
case 0: case 0:
case 1: case 1:
...@@ -332,7 +332,6 @@ ahd_restart(struct ahd_softc *ahd) ...@@ -332,7 +332,6 @@ ahd_restart(struct ahd_softc *ahd)
ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN); ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
ahd_outb(ahd, SCBHCNT, 0); ahd_outb(ahd, SCBHCNT, 0);
ahd_outb(ahd, CCSCBCTL, CCSCBRESET); ahd_outb(ahd, CCSCBCTL, CCSCBRESET);
ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET); ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
ahd_unpause(ahd); ahd_unpause(ahd);
} }
...@@ -357,12 +356,106 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) ...@@ -357,12 +356,106 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
} }
/************************* Input/Output Queues ********************************/ /************************* Input/Output Queues ********************************/
/*
* Flush and completed commands that are sitting in the command
* complete queues down on the chip but have yet to be dma'ed back up.
*/
void
ahd_flush_qoutfifo(struct ahd_softc *ahd)
{
struct scb *scb;
ahd_mode_state saved_modes;
u_int saved_scbptr;
u_int ccscbctl;
u_int scbid;
u_int next_scbid;
saved_modes = ahd_save_modes(ahd);
ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
saved_scbptr = ahd_get_scbptr(ahd);
/*
* Wait for any inprogress DMA to complete and clear DMA state
* if this if for an SCB in the qinfifo.
*/
while ((ccscbctl = ahd_inb(ahd, CCSCBCTL) & (CCARREN|CCSCBEN)) != 0) {
if ((ccscbctl & (CCSCBDIR|CCARREN)) == (CCSCBDIR|CCARREN)) {
if ((ccscbctl & ARRDONE) != 0)
break;
} else if ((ccscbctl & CCSCBDONE) != 0)
break;
ahd_delay(200);
}
if ((ccscbctl & CCSCBDIR) != 0)
ahd_outb(ahd, CCSCBCTL, ccscbctl & ~(CCARREN|CCSCBEN));
/*
* Complete any SCBs that just finished being
* DMA'ed into the qoutfifo.
*/
ahd_run_qoutfifo(ahd);
/*
* Manually update/complete any completed SCBs that are waiting to be
* DMA'ed back up to the host.
*/
scbid = ahd_inw(ahd, COMPLETE_DMA_SCB_HEAD);
while (!SCBID_IS_NULL(scbid)) {
uint8_t *hscb_ptr;
u_int i;
ahd_set_scbptr(ahd, scbid);
next_scbid = ahd_inw(ahd, SCB_NEXT_COMPLETE);
scb = ahd_lookup_scb(ahd, scbid);
if (scb == NULL) {
printf("%s: Warning - DMA-up and complete "
"SCB %d invalid\n", ahd_name(ahd), scbid);
continue;
}
hscb_ptr = (uint8_t *)scb->hscb;
for (i = 0; i < sizeof(struct hardware_scb); i++)
*hscb_ptr++ = ahd_inb(ahd, SCB_BASE + i);
ahd_complete_scb(ahd, scb);
scbid = next_scbid;
}
ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, SCB_LIST_NULL);
scbid = ahd_inw(ahd, COMPLETE_SCB_HEAD);
while (!SCBID_IS_NULL(scbid)) {
ahd_set_scbptr(ahd, scbid);
next_scbid = ahd_inw(ahd, SCB_NEXT_COMPLETE);
scb = ahd_lookup_scb(ahd, scbid);
if (scb == NULL) {
printf("%s: Warning - Complete SCB %d invalid\n",
ahd_name(ahd), scbid);
continue;
}
ahd_complete_scb(ahd, scb);
scbid = next_scbid;
}
ahd_outw(ahd, COMPLETE_SCB_HEAD, SCB_LIST_NULL);
/*
* Restore state.
*/
ahd_set_scbptr(ahd, saved_scbptr);
ahd_restore_modes(ahd, saved_modes);
ahd->flags |= AHD_UPDATE_PEND_CMDS;
}
void void
ahd_run_qoutfifo(struct ahd_softc *ahd) ahd_run_qoutfifo(struct ahd_softc *ahd)
{ {
struct scb *scb; struct scb *scb;
u_int scb_index; u_int scb_index;
if ((ahd->flags & AHD_RUNNING_QOUTFIFO) != 0)
panic("ahd_run_qoutfifo recursion");
ahd->flags |= AHD_RUNNING_QOUTFIFO;
ahd_sync_qoutfifo(ahd, BUS_DMASYNC_POSTREAD); ahd_sync_qoutfifo(ahd, BUS_DMASYNC_POSTREAD);
while ((ahd->qoutfifo[ahd->qoutfifonext] while ((ahd->qoutfifo[ahd->qoutfifonext]
& QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) { & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) {
...@@ -382,8 +475,8 @@ ahd_run_qoutfifo(struct ahd_softc *ahd) ...@@ -382,8 +475,8 @@ ahd_run_qoutfifo(struct ahd_softc *ahd)
ahd->qoutfifonext = (ahd->qoutfifonext+1) & (AHD_QOUT_SIZE-1); ahd->qoutfifonext = (ahd->qoutfifonext+1) & (AHD_QOUT_SIZE-1);
if (ahd->qoutfifonext == 0) if (ahd->qoutfifonext == 0)
ahd->qoutfifonext_valid_tag ^= QOUTFIFO_ENTRY_VALID_LE; ahd->qoutfifonext_valid_tag ^= QOUTFIFO_ENTRY_VALID_LE;
} }
ahd->flags &= ~AHD_RUNNING_QOUTFIFO;
} }
/************************* Interrupt Handling *********************************/ /************************* Interrupt Handling *********************************/
...@@ -1041,7 +1134,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) ...@@ -1041,7 +1134,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat)
} }
ahd_outb(ahd, CLRINT, CLRSCSIINT); ahd_outb(ahd, CLRINT, CLRSCSIINT);
ahd_iocell_first_selection(ahd); ahd_iocell_first_selection(ahd);
ahd_restart(ahd); ahd_unpause(ahd);
} else if ((status0 & (SELDI|SELDO)) != 0) { } else if ((status0 & (SELDI|SELDO)) != 0) {
ahd_iocell_first_selection(ahd); ahd_iocell_first_selection(ahd);
ahd_unpause(ahd); ahd_unpause(ahd);
...@@ -1699,10 +1792,6 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) ...@@ -1699,10 +1792,6 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
ahd_freeze_scb(scb); ahd_freeze_scb(scb);
if ((ahd->msg_flags & MSG_FLAG_IU_REQ_CHANGED) != 0) { if ((ahd->msg_flags & MSG_FLAG_IU_REQ_CHANGED) != 0) {
ahd_print_path(ahd, scb);
printf("Now %spacketized.\n",
(scb->flags & SCB_PACKETIZED) == 0
? "" : "non-");
ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb), ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb),
SCB_GET_CHANNEL(ahd, scb), SCB_GET_CHANNEL(ahd, scb),
SCB_GET_LUN(scb), SCB_LIST_NULL, SCB_GET_LUN(scb), SCB_LIST_NULL,
...@@ -2324,7 +2413,6 @@ ahd_update_neg_request(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ...@@ -2324,7 +2413,6 @@ ahd_update_neg_request(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
tinfo->curr.period = AHD_PERIOD_UNKNOWN; tinfo->curr.period = AHD_PERIOD_UNKNOWN;
tinfo->curr.width = AHD_WIDTH_UNKNOWN; tinfo->curr.width = AHD_WIDTH_UNKNOWN;
tinfo->curr.offset = AHD_OFFSET_UNKNOWN; tinfo->curr.offset = AHD_OFFSET_UNKNOWN;
tinfo->curr.ppr_options = AHD_OFFSET_UNKNOWN;
} }
if (tinfo->curr.period != tinfo->goal.period if (tinfo->curr.period != tinfo->goal.period
|| tinfo->curr.width != tinfo->goal.width || tinfo->curr.width != tinfo->goal.width
...@@ -2940,9 +3028,10 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ...@@ -2940,9 +3028,10 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
"does not have a waiting message\n"); "does not have a waiting message\n");
printf("SCSIID = %x, target_mask = %x\n", scb->hscb->scsiid, printf("SCSIID = %x, target_mask = %x\n", scb->hscb->scsiid,
devinfo->target_mask); devinfo->target_mask);
panic("SCB = %d, SCB Control = %x, MSG_OUT = %x " panic("SCB = %d, SCB Control = %x:%x, MSG_OUT = %x "
"SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control, "SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control,
ahd_inb(ahd, MSG_OUT), scb->flags); ahd_inb(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
scb->flags);
} }
/* /*
...@@ -3525,8 +3614,10 @@ ahd_sent_msg(struct ahd_softc *ahd, ahd_msgtype type, u_int msgval, int full) ...@@ -3525,8 +3614,10 @@ ahd_sent_msg(struct ahd_softc *ahd, ahd_msgtype type, u_int msgval, int full)
} else { } else {
/* Single byte message */ /* Single byte message */
if (type == AHDMSG_1B if (type == AHDMSG_1B
&& ahd->msgout_buf[index] == msgval && ahd->msgout_index > index
&& ahd->msgout_index > index) && (ahd->msgout_buf[index] == msgval
|| ((ahd->msgout_buf[index] & MSG_IDENTIFYFLAG) != 0))
&& msgval == MSG_IDENTIFYFLAG)
found = TRUE; found = TRUE;
index++; index++;
} }
...@@ -4093,6 +4184,20 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ...@@ -4093,6 +4184,20 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
SCB_GET_LUN(scb), /*tag*/SCB_LIST_NULL, SCB_GET_LUN(scb), /*tag*/SCB_LIST_NULL,
ROLE_INITIATOR, CAM_REQUEUE_REQ, ROLE_INITIATOR, CAM_REQUEUE_REQ,
SEARCH_COMPLETE); SEARCH_COMPLETE);
} else if (ahd_sent_msg(ahd, AHDMSG_1B, MSG_IDENTIFYFLAG, TRUE)) {
/*
* Most likely the device believes that we had
* previously negotiated packetized.
*/
ahd->msg_flags |= MSG_FLAG_EXPECT_PPR_BUSFREE
| MSG_FLAG_IU_REQ_CHANGED;
ahd_force_renegotiation(ahd, devinfo);
ahd->msgout_index = 0;
ahd->msgout_len = 0;
ahd_build_transfer_msg(ahd, devinfo);
ahd->msgout_index = 0;
response = 1;
} else { } else {
/* /*
* Otherwise, we ignore it. * Otherwise, we ignore it.
...@@ -4531,6 +4636,13 @@ ahd_alloc(void *platform_arg, char *name) ...@@ -4531,6 +4636,13 @@ ahd_alloc(void *platform_arg, char *name)
ahd->flags = AHD_SPCHK_ENB_A|AHD_RESET_BUS_A|AHD_TERM_ENB_A ahd->flags = AHD_SPCHK_ENB_A|AHD_RESET_BUS_A|AHD_TERM_ENB_A
| AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A; | AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A;
ahd_timer_init(&ahd->reset_timer); ahd_timer_init(&ahd->reset_timer);
ahd_timer_init(&ahd->stat_timer);
ahd->int_coalessing_timer = AHD_INT_COALESSING_TIMER_DEFAULT;
ahd->int_coalessing_maxcmds = AHD_INT_COALESSING_MAXCMDS_DEFAULT;
ahd->int_coalessing_mincmds = AHD_INT_COALESSING_MINCMDS_DEFAULT;
ahd->int_coalessing_threshold = AHD_INT_COALESSING_THRESHOLD_DEFAULT;
ahd->int_coalessing_stop_threshold =
AHD_INT_COALESSING_STOP_THRESHOLD_DEFAULT;
if (ahd_platform_alloc(ahd, platform_arg) != 0) { if (ahd_platform_alloc(ahd, platform_arg) != 0) {
ahd_free(ahd); ahd_free(ahd);
...@@ -4723,6 +4835,12 @@ ahd_shutdown(void *arg) ...@@ -4723,6 +4835,12 @@ ahd_shutdown(void *arg)
ahd = (struct ahd_softc *)arg; ahd = (struct ahd_softc *)arg;
/*
* Stop periodic timer callbacks.
*/
ahd_timer_stop(&ahd->reset_timer);
ahd_timer_stop(&ahd->stat_timer);
/* This will reset most registers to 0, but not all */ /* This will reset most registers to 0, but not all */
ahd_reset(ahd); ahd_reset(ahd);
} }
...@@ -5724,6 +5842,8 @@ ahd_init(struct ahd_softc *ahd) ...@@ -5724,6 +5842,8 @@ ahd_init(struct ahd_softc *ahd)
} }
init_done: init_done:
ahd_restart(ahd); ahd_restart(ahd);
ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
ahd_stat_timer, ahd);
return (0); return (0);
} }
...@@ -5746,6 +5866,12 @@ ahd_chip_init(struct ahd_softc *ahd) ...@@ -5746,6 +5866,12 @@ ahd_chip_init(struct ahd_softc *ahd)
*/ */
ahd_outb(ahd, SBLKCTL, ahd_inb(ahd, SBLKCTL) & ~(DIAGLEDEN|DIAGLEDON)); ahd_outb(ahd, SBLKCTL, ahd_inb(ahd, SBLKCTL) & ~(DIAGLEDEN|DIAGLEDON));
/*
* Return HS_MAILBOX to its default value.
*/
ahd->hs_mailbox = 0;
ahd_outb(ahd, HS_MAILBOX, 0);
/* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1. */ /* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1. */
ahd_outb(ahd, IOWNID, ahd->our_id); ahd_outb(ahd, IOWNID, ahd->our_id);
ahd_outb(ahd, TOWNID, ahd->our_id); ahd_outb(ahd, TOWNID, ahd->our_id);
...@@ -5850,9 +5976,10 @@ ahd_chip_init(struct ahd_softc *ahd) ...@@ -5850,9 +5976,10 @@ ahd_chip_init(struct ahd_softc *ahd)
ahd_outb(ahd, LQOMODE1, 0); ahd_outb(ahd, LQOMODE1, 0);
/* /*
* Setup sequencer interrupt handler. * Setup sequencer interrupt handlers.
*/ */
ahd_outw(ahd, INTVEC1_ADDR, ahd_resolve_seqaddr(ahd, LABEL_seq_isr)); ahd_outw(ahd, INTVEC1_ADDR, ahd_resolve_seqaddr(ahd, LABEL_seq_isr));
ahd_outw(ahd, INTVEC2_ADDR, ahd_resolve_seqaddr(ahd, LABEL_timer_isr));
/* /*
* Setup SCB Offset registers. * Setup SCB Offset registers.
...@@ -6034,6 +6161,17 @@ ahd_chip_init(struct ahd_softc *ahd) ...@@ -6034,6 +6161,17 @@ ahd_chip_init(struct ahd_softc *ahd)
ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF); ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF); ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF); ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
/*
* Default to coalessing disabled.
*/
ahd_outw(ahd, INT_COALESSING_CMDCOUNT, 0);
ahd_outw(ahd, CMDS_PENDING, 0);
ahd_update_coalessing_values(ahd, ahd->int_coalessing_timer,
ahd->int_coalessing_maxcmds,
ahd->int_coalessing_mincmds);
ahd_enable_coalessing(ahd, FALSE);
ahd_loadseq(ahd); ahd_loadseq(ahd);
ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
} }
...@@ -6268,6 +6406,36 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable) ...@@ -6268,6 +6406,36 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
ahd_outb(ahd, HCNTRL, hcntrl); ahd_outb(ahd, HCNTRL, hcntrl);
} }
void
ahd_update_coalessing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
u_int mincmds)
{
if (timer > AHD_TIMER_MAX_US)
timer = AHD_TIMER_MAX_US;
ahd->int_coalessing_timer = timer;
if (maxcmds > AHD_INT_COALESSING_MAXCMDS_MAX)
maxcmds = AHD_INT_COALESSING_MAXCMDS_MAX;
if (mincmds > AHD_INT_COALESSING_MINCMDS_MAX)
mincmds = AHD_INT_COALESSING_MINCMDS_MAX;
ahd->int_coalessing_maxcmds = maxcmds;
ahd_outw(ahd, INT_COALESSING_TIMER, timer / AHD_TIMER_US_PER_TICK);
ahd_outb(ahd, INT_COALESSING_MAXCMDS, -maxcmds);
ahd_outb(ahd, INT_COALESSING_MINCMDS, -mincmds);
}
void
ahd_enable_coalessing(struct ahd_softc *ahd, int enable)
{
ahd->hs_mailbox &= ~ENINT_COALESS;
if (enable)
ahd->hs_mailbox |= ENINT_COALESS;
ahd_outb(ahd, HS_MAILBOX, ahd->hs_mailbox);
ahd_flush_device_writes(ahd);
ahd_run_qoutfifo(ahd);
}
/* /*
* Ensure that the card is paused in a location * Ensure that the card is paused in a location
* outside of all critical sections and that all * outside of all critical sections and that all
...@@ -6278,24 +6446,51 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable) ...@@ -6278,24 +6446,51 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
void void
ahd_pause_and_flushwork(struct ahd_softc *ahd) ahd_pause_and_flushwork(struct ahd_softc *ahd)
{ {
int intstat; u_int intstat;
int maxloops; u_int maxloops;
int paused;
maxloops = 1000; maxloops = 1000;
ahd->flags |= AHD_ALL_INTERRUPTS; ahd->flags |= AHD_ALL_INTERRUPTS;
intstat = 0; intstat = 0;
paused = FALSE;
do { do {
struct scb *waiting_scb;
if (paused)
ahd_unpause(ahd);
ahd_intr(ahd); ahd_intr(ahd);
ahd_pause(ahd); ahd_pause(ahd);
paused = TRUE;
ahd_clear_critical_section(ahd); ahd_clear_critical_section(ahd);
if ((ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) == 0)
ahd_outb(ahd, SCSISEQ0,
ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
/*
* In the non-packetized case, the sequencer (for Rev A),
* relies on ENSELO remaining set after SELDO. The hardware
* auto-clears ENSELO in the packetized case.
*/
waiting_scb = ahd_lookup_scb(ahd,
ahd_inw(ahd, WAITING_TID_HEAD));
if (waiting_scb != NULL
&& (waiting_scb->flags & SCB_PACKETIZED) == 0
&& (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) != 0)
ahd_outb(ahd, SCSISEQ0,
ahd_inb(ahd, SCSISEQ0) | ENSELO);
if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0) if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0)
break; break;
maxloops--; } while (--maxloops
} while (((intstat = ahd_inb(ahd, INTSTAT)) & INT_PEND) && --maxloops); && (((intstat = ahd_inb(ahd, INTSTAT)) & INT_PEND) != 0
|| (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO))));
if (maxloops == 0) { if (maxloops == 0) {
printf("Infinite interrupt loop, INTSTAT = %x", printf("Infinite interrupt loop, INTSTAT = %x",
ahd_inb(ahd, INTSTAT)); ahd_inb(ahd, INTSTAT));
} }
ahd_flush_qoutfifo(ahd);
ahd_platform_flushwork(ahd); ahd_platform_flushwork(ahd);
ahd->flags &= ~AHD_ALL_INTERRUPTS; ahd->flags &= ~AHD_ALL_INTERRUPTS;
} }
...@@ -6608,13 +6803,38 @@ ahd_qinfifo_count(struct ahd_softc *ahd) ...@@ -6608,13 +6803,38 @@ ahd_qinfifo_count(struct ahd_softc *ahd)
qinpos = ahd_get_snscb_qoff(ahd); qinpos = ahd_get_snscb_qoff(ahd);
wrap_qinpos = AHD_QIN_WRAP(qinpos); wrap_qinpos = AHD_QIN_WRAP(qinpos);
wrap_qinfifonext = AHD_QIN_WRAP(ahd->qinfifonext); wrap_qinfifonext = AHD_QIN_WRAP(ahd->qinfifonext);
if (wrap_qinfifonext > wrap_qinpos) if (wrap_qinfifonext >= wrap_qinpos)
return (wrap_qinfifonext - wrap_qinpos); return (wrap_qinfifonext - wrap_qinpos);
else else
return (wrap_qinfifonext return (wrap_qinfifonext
+ NUM_ELEMENTS(ahd->qinfifo) - wrap_qinpos); + NUM_ELEMENTS(ahd->qinfifo) - wrap_qinpos);
} }
void
ahd_reset_cmds_pending(struct ahd_softc *ahd)
{
struct scb *scb;
ahd_mode_state saved_modes;
u_int pending_cmds;
saved_modes = ahd_save_modes(ahd);
ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
/*
* Don't count any commands as outstanding that the
* sequencer has already marked for completion.
*/
ahd_flush_qoutfifo(ahd);
pending_cmds = 0;
LIST_FOREACH(scb, &ahd->pending_scbs, pending_links) {
pending_cmds++;
}
ahd_outw(ahd, CMDS_PENDING, pending_cmds - ahd_qinfifo_count(ahd));
ahd_restore_modes(ahd, saved_modes);
ahd->flags &= ~AHD_UPDATE_PEND_CMDS;
}
int int
ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
int lun, u_int tag, role_t role, uint32_t status, int lun, u_int tag, role_t role, uint32_t status,
...@@ -6786,7 +7006,6 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, ...@@ -6786,7 +7006,6 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
printf(")\n"); printf(")\n");
} }
ahd_set_scbptr(ahd, savedscbptr); ahd_set_scbptr(ahd, savedscbptr);
ahd_restore_modes(ahd, saved_modes); ahd_restore_modes(ahd, saved_modes);
return (found); return (found);
} }
...@@ -6859,6 +7078,9 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel, ...@@ -6859,6 +7078,9 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
if (found > AHD_SCB_MAX) if (found > AHD_SCB_MAX)
panic("SCB LIST LOOP"); panic("SCB LIST LOOP");
} }
if (action == SEARCH_COMPLETE
|| action == SEARCH_REMOVE)
ahd_outw(ahd, CMDS_PENDING, ahd_inw(ahd, CMDS_PENDING) - found);
return (found); return (found);
} }
...@@ -7010,6 +7232,12 @@ ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, ...@@ -7010,6 +7232,12 @@ ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel,
} }
} }
/*
* Don't abort commands that have already completed,
* but haven't quite made it up to the host yet.
*/
ahd_flush_qoutfifo(ahd);
/* /*
* Go through the pending CCB list and look for * Go through the pending CCB list and look for
* commands for this target that are still active. * commands for this target that are still active.
...@@ -7037,6 +7265,7 @@ ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, ...@@ -7037,6 +7265,7 @@ ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel,
ahd_set_scbptr(ahd, active_scb); ahd_set_scbptr(ahd, active_scb);
ahd_restore_modes(ahd, saved_modes); ahd_restore_modes(ahd, saved_modes);
ahd_platform_abort_scbs(ahd, target, channel, lun, tag, role, status); ahd_platform_abort_scbs(ahd, target, channel, lun, tag, role, status);
ahd->flags |= AHD_UPDATE_PEND_CMDS;
return found; return found;
} }
...@@ -7091,12 +7320,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) ...@@ -7091,12 +7320,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
/* Make sure the sequencer is in a safe location. */ /* Make sure the sequencer is in a safe location. */
ahd_clear_critical_section(ahd); ahd_clear_critical_section(ahd);
/*
* Run our command complete fifos to ensure that we perform
* completion processing on any commands that 'completed'
* before the reset occurred.
*/
ahd_run_qoutfifo(ahd);
#if AHD_TARGET_MODE #if AHD_TARGET_MODE
if ((ahd->flags & AHD_TARGETROLE) != 0) { if ((ahd->flags & AHD_TARGETROLE) != 0) {
ahd_run_tqinfifo(ahd, /*paused*/TRUE); ahd_run_tqinfifo(ahd, /*paused*/TRUE);
...@@ -7266,6 +7489,51 @@ ahd_reset_poll(void *arg) ...@@ -7266,6 +7489,51 @@ ahd_reset_poll(void *arg)
ahd_list_unlock(&l); ahd_list_unlock(&l);
} }
/**************************** Statistics Processing ***************************/
static void
ahd_stat_timer(void *arg)
{
struct ahd_softc *ahd;
u_long l;
u_long s;
int enint_coal;
ahd_list_lock(&l);
ahd = ahd_find_softc((struct ahd_softc *)arg);
if (ahd == NULL) {
printf("ahd_stat_timer: Instance %p no longer exists\n", arg);
ahd_list_unlock(&l);
return;
}
ahd_lock(ahd, &s);
enint_coal = ahd->hs_mailbox & ENINT_COALESS;
if (ahd->cmdcmplt_total > ahd->int_coalessing_threshold)
enint_coal |= ENINT_COALESS;
else if (ahd->cmdcmplt_total < ahd->int_coalessing_stop_threshold)
enint_coal &= ~ENINT_COALESS;
if (enint_coal != (ahd->hs_mailbox & ENINT_COALESS)) {
ahd_enable_coalessing(ahd, enint_coal);
#ifdef AHD_DEBUG
if ((ahd_debug & AHD_SHOW_INT_COALESSING) != 0)
printf("%s: Interrupt coalessing "
"now %sabled. Cmds %d\n",
ahd_name(ahd),
(enint_coal & ENINT_COALESS) ? "en" : "dis",
ahd->cmdcmplt_total,
ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]);
#endif
}
ahd->cmdcmplt_bucket = (ahd->cmdcmplt_bucket+1) & (AHD_STAT_BUCKETS-1);
ahd->cmdcmplt_total -= ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket];
ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket] = 0;
ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
ahd_stat_timer, ahd);
ahd_unlock(ahd, &s);
ahd_list_unlock(&l);
}
/****************************** Status Processing *****************************/ /****************************** Status Processing *****************************/
void void
...@@ -8121,6 +8389,9 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8121,6 +8389,9 @@ ahd_dump_card_state(struct ahd_softc *ahd)
* Mode independent registers. * Mode independent registers.
*/ */
cur_col = 0; cur_col = 0;
ahd_hs_mailbox_print(ahd_inb(ahd, LOCAL_HS_MAILBOX), &cur_col, 50);
ahd_intctl_print(ahd_inb(ahd, INTCTL), &cur_col, 50);
ahd_seqintstat_print(ahd_inb(ahd, SEQINTSTAT), &cur_col, 50);
ahd_saved_mode_print(ahd_inb(ahd, SAVED_MODE), &cur_col, 50); ahd_saved_mode_print(ahd_inb(ahd, SAVED_MODE), &cur_col, 50);
ahd_dffstat_print(ahd_inb(ahd, DFFSTAT), &cur_col, 50); ahd_dffstat_print(ahd_inb(ahd, DFFSTAT), &cur_col, 50);
ahd_scsisigi_print(ahd_inb(ahd, SCSISIGI), &cur_col, 50); ahd_scsisigi_print(ahd_inb(ahd, SCSISIGI), &cur_col, 50);
...@@ -8133,7 +8404,6 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8133,7 +8404,6 @@ ahd_dump_card_state(struct ahd_softc *ahd)
ahd_seqintctl_print(ahd_inb(ahd, SEQINTCTL), &cur_col, 50); ahd_seqintctl_print(ahd_inb(ahd, SEQINTCTL), &cur_col, 50);
ahd_seq_flags_print(ahd_inb(ahd, SEQ_FLAGS), &cur_col, 50); ahd_seq_flags_print(ahd_inb(ahd, SEQ_FLAGS), &cur_col, 50);
ahd_seq_flags2_print(ahd_inb(ahd, SEQ_FLAGS2), &cur_col, 50); ahd_seq_flags2_print(ahd_inb(ahd, SEQ_FLAGS2), &cur_col, 50);
ahd_ccscbctl_print(ahd_inb(ahd, CCSCBCTL), &cur_col, 50);
ahd_sstat0_print(ahd_inb(ahd, SSTAT0), &cur_col, 50); ahd_sstat0_print(ahd_inb(ahd, SSTAT0), &cur_col, 50);
ahd_sstat1_print(ahd_inb(ahd, SSTAT1), &cur_col, 50); ahd_sstat1_print(ahd_inb(ahd, SSTAT1), &cur_col, 50);
ahd_sstat2_print(ahd_inb(ahd, SSTAT2), &cur_col, 50); ahd_sstat2_print(ahd_inb(ahd, SSTAT2), &cur_col, 50);
...@@ -8147,9 +8417,11 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8147,9 +8417,11 @@ ahd_dump_card_state(struct ahd_softc *ahd)
ahd_lqostat1_print(ahd_inb(ahd, LQOSTAT1), &cur_col, 50); ahd_lqostat1_print(ahd_inb(ahd, LQOSTAT1), &cur_col, 50);
ahd_lqostat2_print(ahd_inb(ahd, LQOSTAT2), &cur_col, 50); ahd_lqostat2_print(ahd_inb(ahd, LQOSTAT2), &cur_col, 50);
printf("\n"); printf("\n");
printf("\nSCB Count = %d LASTSCB 0x%x CURRSCB 0x%x NEXTSCB 0x%x\n", printf("\nSCB Count = %d CMDS_PENDING = %d LASTSCB 0x%x "
ahd->scb_data.numscbs, ahd_inw(ahd, LASTSCB), "CURRSCB 0x%x NEXTSCB 0x%x\n",
ahd_inw(ahd, CURRSCB), ahd_inw(ahd, NEXTSCB)); ahd->scb_data.numscbs, ahd_inw(ahd, CMDS_PENDING),
ahd_inw(ahd, LASTSCB), ahd_inw(ahd, CURRSCB),
ahd_inw(ahd, NEXTSCB));
cur_col = 0; cur_col = 0;
/* QINFIFO */ /* QINFIFO */
ahd_search_qinfifo(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS, ahd_search_qinfifo(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
...@@ -8167,7 +8439,7 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8167,7 +8439,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
ahd_scb_scsiid_print(ahd_inb(ahd, SCB_SCSIID), &cur_col, 60); ahd_scb_scsiid_print(ahd_inb(ahd, SCB_SCSIID), &cur_col, 60);
ahd_scb_tag_print(ahd_inb(ahd, SCB_TAG), &cur_col, 60); ahd_scb_tag_print(ahd_inb(ahd, SCB_TAG), &cur_col, 60);
} }
printf("\n"); printf("\nTotal %d\n", i);
printf("Kernel Free SCB list: "); printf("Kernel Free SCB list: ");
i = 0; i = 0;
...@@ -8249,7 +8521,7 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8249,7 +8521,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
printf("\n"); printf("\n");
cur_col = 0; cur_col = 0;
} }
cur_col += printf("SHADDR = 0x%x%x, SHCNT = 0x%x", cur_col += printf("SHADDR = 0x%x%x, SHCNT = 0x%x ",
ahd_inl(ahd, SHADDR+4), ahd_inl(ahd, SHADDR+4),
ahd_inl(ahd, SHADDR), ahd_inl(ahd, SHADDR),
(ahd_inb(ahd, SHCNT) (ahd_inb(ahd, SHCNT)
...@@ -8287,6 +8559,10 @@ ahd_dump_card_state(struct ahd_softc *ahd) ...@@ -8287,6 +8559,10 @@ ahd_dump_card_state(struct ahd_softc *ahd)
ahd_inb(ahd, MAXCMDCNT)); ahd_inb(ahd, MAXCMDCNT));
ahd_simode0_print(ahd_inb(ahd, SIMODE0), &cur_col, 50); ahd_simode0_print(ahd_inb(ahd, SIMODE0), &cur_col, 50);
printf("\n"); printf("\n");
ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
cur_col = 0;
ahd_ccscbctl_print(ahd_inb(ahd, CCSCBCTL), &cur_col, 50);
printf("\n");
ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode); ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
printf("%s: REG0 == 0x%x, SINDEX = 0x%x, DINDEX = 0x%x\n", printf("%s: REG0 == 0x%x, SINDEX = 0x%x, DINDEX = 0x%x\n",
ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX), ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX),
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#39 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#40 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -217,8 +217,11 @@ ahd_unpause(struct ahd_softc *ahd) ...@@ -217,8 +217,11 @@ ahd_unpause(struct ahd_softc *ahd)
* prior to the first change of the mode. * prior to the first change of the mode.
*/ */
if (ahd->saved_src_mode != AHD_MODE_UNKNOWN if (ahd->saved_src_mode != AHD_MODE_UNKNOWN
&& ahd->saved_dst_mode != AHD_MODE_UNKNOWN) && ahd->saved_dst_mode != AHD_MODE_UNKNOWN) {
if ((ahd->flags & AHD_UPDATE_PEND_CMDS) != 0)
ahd_reset_cmds_pending(ahd);
ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode); ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
}
if ((ahd_inb(ahd, INTSTAT) & ~(SWTMINT | CMDCMPLT)) == 0) if ((ahd_inb(ahd, INTSTAT) & ~(SWTMINT | CMDCMPLT)) == 0)
ahd_outb(ahd, HCNTRL, ahd->unpause); ahd_outb(ahd, HCNTRL, ahd->unpause);
...@@ -913,6 +916,8 @@ ahd_intr(struct ahd_softc *ahd) ...@@ -913,6 +916,8 @@ ahd_intr(struct ahd_softc *ahd)
ahd_flush_device_writes(ahd); ahd_flush_device_writes(ahd);
} }
ahd_run_qoutfifo(ahd); ahd_run_qoutfifo(ahd);
ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++;
ahd->cmdcmplt_total++;
#ifdef AHD_TARGET_MODE #ifdef AHD_TARGET_MODE
if ((ahd->flags & AHD_TARGETROLE) != 0) if ((ahd->flags & AHD_TARGETROLE) != 0)
ahd_run_tqinfifo(ahd, /*paused*/FALSE); ahd_run_tqinfifo(ahd, /*paused*/FALSE);
......
/* /*
* Adaptec AIC79xx device driver for Linux. * Adaptec AIC79xx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#93 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#100 $
* *
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs. * Copyright (c) 1994-2000 Justin T. Gibbs.
...@@ -88,6 +88,11 @@ struct proc_dir_entry proc_scsi_aic79xx = { ...@@ -88,6 +88,11 @@ struct proc_dir_entry proc_scsi_aic79xx = {
}; };
#endif #endif
/*
* Bucket size for counting good commands in between bad ones.
*/
#define AHD_LINUX_ERR_THRESH 1000
/* /*
* Set this to the delay in seconds after SCSI bus reset. * Set this to the delay in seconds after SCSI bus reset.
* Note, we honor this only for the initial bus reset. * Note, we honor this only for the initial bus reset.
...@@ -491,7 +496,7 @@ static void ahd_linux_dv_transition(struct ahd_softc *ahd, ...@@ -491,7 +496,7 @@ static void ahd_linux_dv_transition(struct ahd_softc *ahd,
struct scsi_cmnd *cmd, struct scsi_cmnd *cmd,
struct ahd_devinfo *devinfo, struct ahd_devinfo *devinfo,
struct ahd_linux_target *targ); struct ahd_linux_target *targ);
static uint32_t aic_dv_error_action(struct scsi_cmnd *cmd, static uint32_t aic_error_action(struct scsi_cmnd *cmd,
struct scsi_inquiry_data *inq_data); struct scsi_inquiry_data *inq_data);
static void ahd_linux_dv_fill_cmd(struct ahd_softc *ahd, static void ahd_linux_dv_fill_cmd(struct ahd_softc *ahd,
struct scsi_cmnd *cmd, struct scsi_cmnd *cmd,
...@@ -520,8 +525,13 @@ static void ahd_linux_dv_su(struct ahd_softc *ahd, ...@@ -520,8 +525,13 @@ static void ahd_linux_dv_su(struct ahd_softc *ahd,
struct scsi_cmnd *cmd, struct scsi_cmnd *cmd,
struct ahd_devinfo *devinfo, struct ahd_devinfo *devinfo,
struct ahd_linux_target *targ); struct ahd_linux_target *targ);
static __inline int
ahd_linux_dv_fallback(struct ahd_softc *ahd,
struct ahd_devinfo *devinfo);
static int ahd_linux_fallback(struct ahd_softc *ahd, static int ahd_linux_fallback(struct ahd_softc *ahd,
struct ahd_devinfo *devinfo); struct ahd_devinfo *devinfo);
static __inline int ahd_linux_dv_fallback(struct ahd_softc *ahd,
struct ahd_devinfo *devinfo);
static void ahd_linux_dv_complete(Scsi_Cmnd *cmd); static void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
static void ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ); static void ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ);
static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd, static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd,
...@@ -548,6 +558,7 @@ static void ahd_linux_setup_iocell_info(char *p, char *end, char *s, int index); ...@@ -548,6 +558,7 @@ static void ahd_linux_setup_iocell_info(char *p, char *end, char *s, int index);
static int ahd_linux_next_unit(void); static int ahd_linux_next_unit(void);
static void ahd_runq_tasklet(unsigned long data); static void ahd_runq_tasklet(unsigned long data);
static int ahd_linux_halt(struct notifier_block *nb, u_long event, void *buf); static int ahd_linux_halt(struct notifier_block *nb, u_long event, void *buf);
static int aic79xx_setup(char *c);
/****************************** Inlines ***************************************/ /****************************** Inlines ***************************************/
static __inline void ahd_schedule_completeq(struct ahd_softc *ahd, static __inline void ahd_schedule_completeq(struct ahd_softc *ahd,
...@@ -801,6 +812,7 @@ static int ahd_linux_release(struct Scsi_Host *); ...@@ -801,6 +812,7 @@ static int ahd_linux_release(struct Scsi_Host *);
static const char *ahd_linux_info(struct Scsi_Host *); static const char *ahd_linux_info(struct Scsi_Host *);
static int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); static int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
static int ahd_linux_slave_alloc(Scsi_Device *);
static int ahd_linux_slave_configure(Scsi_Device *); static int ahd_linux_slave_configure(Scsi_Device *);
static void ahd_linux_slave_destroy(Scsi_Device *); static void ahd_linux_slave_destroy(Scsi_Device *);
static int ahd_linux_biosparam(struct scsi_device*, static int ahd_linux_biosparam(struct scsi_device*,
...@@ -862,15 +874,6 @@ ahd_linux_detect(Scsi_Host_Template *template) ...@@ -862,15 +874,6 @@ ahd_linux_detect(Scsi_Host_Template *template)
template->proc_dir = &proc_scsi_aic79xx; template->proc_dir = &proc_scsi_aic79xx;
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
/*
* We can only map 16MB per-SG
* so create a sector limit of
* "16MB" in 2K sectors.
*/
template->max_sectors = 8192;
#endif
/* /*
* Initialize our softc list lock prior to * Initialize our softc list lock prior to
* probing for any adapters. * probing for any adapters.
...@@ -1013,6 +1016,17 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *)) ...@@ -1013,6 +1016,17 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
} }
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
static int
ahd_linux_slave_alloc(Scsi_Device *device)
{
struct ahd_softc *ahd;
ahd = *((struct ahd_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Alloc %d\n", ahd_name(ahd), device->id);
return (0);
}
static int static int
ahd_linux_slave_configure(Scsi_Device *device) ahd_linux_slave_configure(Scsi_Device *device)
{ {
...@@ -1021,6 +1035,8 @@ ahd_linux_slave_configure(Scsi_Device *device) ...@@ -1021,6 +1035,8 @@ ahd_linux_slave_configure(Scsi_Device *device)
u_long flags; u_long flags;
ahd = *((struct ahd_softc **)device->host->hostdata); ahd = *((struct ahd_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Configure %d\n", ahd_name(ahd), device->id);
ahd_midlayer_entrypoint_lock(ahd, &flags); ahd_midlayer_entrypoint_lock(ahd, &flags);
/* /*
* Since Linux has attached to the device, configure * Since Linux has attached to the device, configure
...@@ -1032,9 +1048,10 @@ ahd_linux_slave_configure(Scsi_Device *device) ...@@ -1032,9 +1048,10 @@ ahd_linux_slave_configure(Scsi_Device *device)
/*alloc*/TRUE); /*alloc*/TRUE);
if (dev != NULL) { if (dev != NULL) {
dev->flags &= ~AHD_DEV_UNCONFIGURED; dev->flags &= ~AHD_DEV_UNCONFIGURED;
dev->flags |= AHD_DEV_SLAVE_CONFIGURED;
dev->scsi_device = device; dev->scsi_device = device;
}
ahd_linux_device_queue_depth(ahd, dev); ahd_linux_device_queue_depth(ahd, dev);
}
ahd_midlayer_entrypoint_unlock(ahd, &flags); ahd_midlayer_entrypoint_unlock(ahd, &flags);
return (0); return (0);
} }
...@@ -1047,12 +1064,27 @@ ahd_linux_slave_destroy(Scsi_Device *device) ...@@ -1047,12 +1064,27 @@ ahd_linux_slave_destroy(Scsi_Device *device)
u_long flags; u_long flags;
ahd = *((struct ahd_softc **)device->host->hostdata); ahd = *((struct ahd_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Destroy %d\n", ahd_name(ahd), device->id);
ahd_midlayer_entrypoint_lock(ahd, &flags); ahd_midlayer_entrypoint_lock(ahd, &flags);
dev = ahd_linux_get_device(ahd, device->channel, dev = ahd_linux_get_device(ahd, device->channel,
device->id, device->lun, device->id, device->lun,
/*alloc*/FALSE); /*alloc*/FALSE);
if (dev != NULL)
/*
* Filter out "silly" deletions of real devices by only
* deleting devices that have had slave_configure()
* called on them. All other devices that have not
* been configured will automatically be deleted by
* the refcounting process.
*/
if (dev != NULL
&& (dev->flags & AHD_DEV_SLAVE_CONFIGURED) != 0) {
dev->flags |= AHD_DEV_UNCONFIGURED; dev->flags |= AHD_DEV_UNCONFIGURED;
if (TAILQ_EMPTY(&dev->busyq)
&& dev->active == 0)
ahd_linux_free_device(ahd, dev);
}
ahd_midlayer_entrypoint_unlock(ahd, &flags); ahd_midlayer_entrypoint_unlock(ahd, &flags);
} }
#else #else
...@@ -1253,7 +1285,7 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd) ...@@ -1253,7 +1285,7 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd)
#endif #endif
ahd = *(struct ahd_softc **)cmd->host->hostdata; ahd = *(struct ahd_softc **)cmd->host->hostdata;
#ifdef AHD_DEBUG #ifdef AHD_DEBUG
if ((ahd_debug & AHD_SHOW_RECOVERY) != 0); if ((ahd_debug & AHD_SHOW_RECOVERY) != 0)
printf("%s: Bus reset called for cmd %p\n", printf("%s: Bus reset called for cmd %p\n",
ahd_name(ahd), cmd); ahd_name(ahd), cmd);
#endif #endif
...@@ -1299,6 +1331,14 @@ Scsi_Host_Template aic79xx_driver_template = { ...@@ -1299,6 +1331,14 @@ Scsi_Host_Template aic79xx_driver_template = {
.sg_tablesize = AHD_NSEG, .sg_tablesize = AHD_NSEG,
.cmd_per_lun = 2, .cmd_per_lun = 2,
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
/*
* We can only map 16MB per-SG
* so create a sector limit of
* "16MB" in 2K sectors.
*/
.max_sectors = 8192,
#endif
#if defined CONFIG_HIGHIO #if defined CONFIG_HIGHIO
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
/* Assume RedHat Distribution with its different HIGHIO conventions. */ /* Assume RedHat Distribution with its different HIGHIO conventions. */
...@@ -1309,6 +1349,8 @@ Scsi_Host_Template aic79xx_driver_template = { ...@@ -1309,6 +1349,8 @@ Scsi_Host_Template aic79xx_driver_template = {
#endif #endif
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
.name = "aic79xx",
.slave_alloc = ahd_linux_slave_alloc,
.slave_configure = ahd_linux_slave_configure, .slave_configure = ahd_linux_slave_configure,
.slave_destroy = ahd_linux_slave_destroy, .slave_destroy = ahd_linux_slave_destroy,
#else #else
...@@ -1879,7 +1921,7 @@ ahd_linux_setup_tag_info_global(char *p) ...@@ -1879,7 +1921,7 @@ ahd_linux_setup_tag_info_global(char *p)
* to a parameter with a ':' between the parameter and the value. * to a parameter with a ':' between the parameter and the value.
* ie. aic79xx=stpwlev:1,extended * ie. aic79xx=stpwlev:1,extended
*/ */
int static int
aic79xx_setup(char *s) aic79xx_setup(char *s)
{ {
int i, n; int i, n;
...@@ -2683,7 +2725,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -2683,7 +2725,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
{ {
u_int32_t status; u_int32_t status;
status = aic_dv_error_action(cmd, targ->inq_data); status = aic_error_action(cmd, targ->inq_data);
#ifdef AHD_DEBUG #ifdef AHD_DEBUG
...@@ -2807,7 +2849,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -2807,7 +2849,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
break; break;
} }
if (ahd_linux_fallback(ahd, devinfo) != 0) { if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT); AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
break; break;
} }
...@@ -2830,7 +2872,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -2830,7 +2872,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) { == CAM_REQUEUE_REQ) {
targ->dv_state_retry--; targ->dv_state_retry--;
} else if ((status & SSQ_FALLBACK) != 0) { } else if ((status & SSQ_FALLBACK) != 0) {
if (ahd_linux_fallback(ahd, devinfo) != 0) { if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_SET_DV_STATE(ahd, targ,
AHD_DV_STATE_EXIT); AHD_DV_STATE_EXIT);
break; break;
...@@ -2874,7 +2916,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -2874,7 +2916,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) { == CAM_REQUEUE_REQ) {
targ->dv_state_retry--; targ->dv_state_retry--;
} else if ((status & SSQ_FALLBACK) != 0) { } else if ((status & SSQ_FALLBACK) != 0) {
if (ahd_linux_fallback(ahd, devinfo) != 0) { if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_SET_DV_STATE(ahd, targ,
AHD_DV_STATE_EXIT); AHD_DV_STATE_EXIT);
break; break;
...@@ -2987,7 +3029,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -2987,7 +3029,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) { == CAM_REQUEUE_REQ) {
targ->dv_state_retry--; targ->dv_state_retry--;
} else if ((status & SSQ_FALLBACK) != 0) { } else if ((status & SSQ_FALLBACK) != 0) {
if (ahd_linux_fallback(ahd, devinfo) != 0) { if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_SET_DV_STATE(ahd, targ,
AHD_DV_STATE_EXIT); AHD_DV_STATE_EXIT);
break; break;
...@@ -3018,7 +3060,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -3018,7 +3060,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
case SS_NOP: case SS_NOP:
if (memcmp(targ->dv_buffer, targ->dv_buffer1, if (memcmp(targ->dv_buffer, targ->dv_buffer1,
targ->dv_echo_size) != 0) { targ->dv_echo_size) != 0) {
if (ahd_linux_fallback(ahd, devinfo) != 0) if (ahd_linux_dv_fallback(ahd, devinfo) != 0)
AHD_SET_DV_STATE(ahd, targ, AHD_SET_DV_STATE(ahd, targ,
AHD_DV_STATE_EXIT); AHD_DV_STATE_EXIT);
else else
...@@ -3047,7 +3089,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -3047,7 +3089,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) { == CAM_REQUEUE_REQ) {
targ->dv_state_retry--; targ->dv_state_retry--;
} else if ((status & SSQ_FALLBACK) != 0) { } else if ((status & SSQ_FALLBACK) != 0) {
if (ahd_linux_fallback(ahd, devinfo) != 0) { if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_SET_DV_STATE(ahd, targ,
AHD_DV_STATE_EXIT); AHD_DV_STATE_EXIT);
break; break;
...@@ -3126,7 +3168,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd, ...@@ -3126,7 +3168,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
} }
static uint32_t static uint32_t
aic_dv_error_action(struct scsi_cmnd *cmd, struct scsi_inquiry_data *inq_data) aic_error_action(struct scsi_cmnd *cmd, struct scsi_inquiry_data *inq_data)
{ {
aic_sense_action err_action; aic_sense_action err_action;
cam_status status; cam_status status;
...@@ -3392,6 +3434,19 @@ ahd_linux_calc_speed(u_int width, u_int period, u_int offset) ...@@ -3392,6 +3434,19 @@ ahd_linux_calc_speed(u_int width, u_int period, u_int offset)
return (freq); return (freq);
} }
static __inline int
ahd_linux_dv_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
{
u_long s;
int retval;
ahd_lock(ahd, &s);
retval = ahd_linux_fallback(ahd, devinfo);
ahd_unlock(ahd, &s);
return (retval);
}
static int static int
ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
{ {
...@@ -3399,7 +3454,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ...@@ -3399,7 +3454,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
struct ahd_initiator_tinfo *tinfo; struct ahd_initiator_tinfo *tinfo;
struct ahd_transinfo *goal; struct ahd_transinfo *goal;
struct ahd_tmode_tstate *tstate; struct ahd_tmode_tstate *tstate;
u_long s;
u_int width; u_int width;
u_int period; u_int period;
u_int offset; u_int offset;
...@@ -3415,7 +3469,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ...@@ -3415,7 +3469,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
printf("Trying to fallback\n"); printf("Trying to fallback\n");
} }
#endif #endif
ahd_lock(ahd, &s);
targ = ahd->platform_data->targets[devinfo->target_offset]; targ = ahd->platform_data->targets[devinfo->target_offset];
tinfo = ahd_fetch_transinfo(ahd, devinfo->channel, tinfo = ahd_fetch_transinfo(ahd, devinfo->channel,
devinfo->our_scsiid, devinfo->our_scsiid,
...@@ -3545,7 +3598,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ...@@ -3545,7 +3598,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
ppr_options = targ->dv_max_ppr_options; ppr_options = targ->dv_max_ppr_options;
} }
} else { } else {
ahd_unlock(ahd, &s);
return (-1); return (-1);
} }
offset = MAX_OFFSET; offset = MAX_OFFSET;
...@@ -3563,7 +3615,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) ...@@ -3563,7 +3615,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
ahd_set_syncrate(ahd, devinfo, period, offset, ahd_set_syncrate(ahd, devinfo, period, offset,
ppr_options, AHD_TRANS_GOAL, FALSE); ppr_options, AHD_TRANS_GOAL, FALSE);
targ->dv_last_ppr_options = ppr_options; targ->dv_last_ppr_options = ppr_options;
ahd_unlock(ahd, &s);
return (0); return (0);
} }
...@@ -3966,6 +4017,15 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev) ...@@ -3966,6 +4017,15 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
dev->openings--; dev->openings--;
dev->active++; dev->active++;
dev->commands_issued++; dev->commands_issued++;
/* Update the error counting bucket and dump if needed */
if (dev->target->cmds_since_error) {
dev->target->cmds_since_error++;
if (dev->target->cmds_since_error >
AHD_LINUX_ERR_THRESH)
dev->target->cmds_since_error = 0;
}
if ((dev->flags & AHD_DEV_PERIODIC_OTAG) != 0) if ((dev->flags & AHD_DEV_PERIODIC_OTAG) != 0)
dev->commands_since_idle_or_otag++; dev->commands_since_idle_or_otag++;
scb->flags |= SCB_ACTIVE; scb->flags |= SCB_ACTIVE;
...@@ -4377,43 +4437,45 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, ...@@ -4377,43 +4437,45 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
* structure if it is available. * structure if it is available.
*/ */
cmd = scb->io_ctx; cmd = scb->io_ctx;
if (scb->flags & SCB_SENSE) { if ((scb->flags & (SCB_SENSE|SCB_PKT_SENSE)) != 0) {
struct scsi_status_iu_header *siu;
u_int sense_size; u_int sense_size;
u_int sense_offset;
if (scb->flags & SCB_SENSE) {
sense_size = MIN(sizeof(struct scsi_sense_data) sense_size = MIN(sizeof(struct scsi_sense_data)
- ahd_get_sense_residual(scb), - ahd_get_sense_residual(scb),
sizeof(cmd->sense_buffer)); sizeof(cmd->sense_buffer));
memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); sense_offset = 0;
memcpy(cmd->sense_buffer, } else {
ahd_get_sense_buf(ahd, scb), sense_size);
cmd->result |= (DRIVER_SENSE << 24);
} else if (scb->flags & SCB_PKT_SENSE) {
struct scsi_status_iu_header *siu;
u_int sense_len;
/* /*
* Copy only the sense data into the provided buffer. * Copy only the sense data into the provided
* buffer.
*/ */
siu = (struct scsi_status_iu_header *)scb->sense_data; siu = (struct scsi_status_iu_header *)
sense_len = MIN(scsi_4btoul(siu->sense_length), scb->sense_data;
sense_size = MIN(scsi_4btoul(siu->sense_length),
sizeof(cmd->sense_buffer)); sizeof(cmd->sense_buffer));
sense_offset = SIU_SENSE_OFFSET(siu);
}
memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
memcpy(cmd->sense_buffer, memcpy(cmd->sense_buffer,
ahd_get_sense_buf(ahd, scb) ahd_get_sense_buf(ahd, scb)
+ SIU_SENSE_OFFSET(siu), + sense_offset, sense_size);
sense_len); cmd->result |= (DRIVER_SENSE << 24);
#ifdef AHD_DEBUG #ifdef AHD_DEBUG
if (ahd_debug & AHD_SHOW_SENSE) { if (ahd_debug & AHD_SHOW_SENSE) {
int i; int i;
printf("Copied %d bytes of sense data at %d:", printf("Copied %d bytes of sense data at %d:",
sense_len, SIU_SENSE_OFFSET(siu)); sense_size, sense_offset);
for (i = 0; i < sense_len; i++) for (i = 0; i < sense_size; i++)
printf(" 0x%x", cmd->sense_buffer[i]); printf(" 0x%x", cmd->sense_buffer[i]);
printf("\n"); printf("\n");
} }
#endif #endif
cmd->result |= (DRIVER_SENSE << 24);
} }
break; break;
} }
...@@ -4529,9 +4591,43 @@ ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, Scsi_Cmnd *cmd) ...@@ -4529,9 +4591,43 @@ ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, Scsi_Cmnd *cmd)
* state change decisions. * state change decisions.
*/ */
if (AHD_DV_CMD(cmd) == FALSE) { if (AHD_DV_CMD(cmd) == FALSE) {
uint32_t status;
u_int new_status; u_int new_status;
switch (ahd_cmd_get_transaction_status(cmd)) { status = ahd_cmd_get_transaction_status(cmd);
if (status != CAM_REQ_CMP) {
struct ahd_linux_device *dev;
struct ahd_devinfo devinfo;
uint32_t action;
dev = ahd_linux_get_device(ahd, cmd->channel,
cmd->target, cmd->lun,
/*alloc*/FALSE);
if (dev == NULL)
goto no_fallback;
ahd_compile_devinfo(&devinfo,
ahd->our_id,
dev->target->target, dev->lun,
dev->target->channel == 0 ? 'A':'B',
ROLE_INITIATOR);
action = aic_error_action(cmd, dev->target->inq_data);
if ((action & SSQ_FALLBACK) != 0) {
/* Update stats */
dev->target->errors_detected++;
if (dev->target->cmds_since_error == 0)
dev->target->cmds_since_error++;
else {
dev->target->cmds_since_error = 0;
ahd_linux_fallback(ahd, &devinfo);
}
}
}
no_fallback:
switch (status) {
case CAM_REQ_INPROG: case CAM_REQ_INPROG:
case CAM_REQ_CMP: case CAM_REQ_CMP:
case CAM_SCSI_STATUS_ERROR: case CAM_SCSI_STATUS_ERROR:
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#90 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#96 $
* *
*/ */
#ifndef _AIC79XX_LINUX_H_ #ifndef _AIC79XX_LINUX_H_
...@@ -287,7 +287,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec) ...@@ -287,7 +287,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec)
#include <linux/smp.h> #include <linux/smp.h>
#endif #endif
#define AIC79XX_DRIVER_VERSION "1.3.0.ALPHA3" #define AIC79XX_DRIVER_VERSION "1.3.0.ALPHA5"
/**************************** Front End Queues ********************************/ /**************************** Front End Queues ********************************/
/* /*
...@@ -334,7 +334,8 @@ typedef enum { ...@@ -334,7 +334,8 @@ typedef enum {
AHD_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */ AHD_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
AHD_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */ AHD_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
AHD_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */ AHD_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
AHD_DEV_PERIODIC_OTAG = 0x40 /* Send OTAG to prevent starvation */ AHD_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
AHD_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
} ahd_linux_dev_flags; } ahd_linux_dev_flags;
struct ahd_linux_target; struct ahd_linux_target;
...@@ -462,6 +463,12 @@ struct ahd_linux_target { ...@@ -462,6 +463,12 @@ struct ahd_linux_target {
u_int dv_state_retry; u_int dv_state_retry;
uint8_t *dv_buffer; uint8_t *dv_buffer;
uint8_t *dv_buffer1; uint8_t *dv_buffer1;
/*
* Cumulative counter of errors.
*/
u_long errors_detected;
u_long cmds_since_error;
}; };
/********************* Definitions Required by the Core ***********************/ /********************* Definitions Required by the Core ***********************/
...@@ -525,6 +532,7 @@ struct ahd_platform_data { ...@@ -525,6 +532,7 @@ struct ahd_platform_data {
pid_t dv_pid; pid_t dv_pid;
struct timer_list completeq_timer; struct timer_list completeq_timer;
struct timer_list reset_timer; struct timer_list reset_timer;
struct timer_list stats_timer;
struct semaphore eh_sem; struct semaphore eh_sem;
struct semaphore dv_sem; struct semaphore dv_sem;
struct semaphore dv_cmd_sem; /* XXX This needs to be in struct semaphore dv_cmd_sem; /* XXX This needs to be in
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr> * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
* sym driver. * sym driver.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#9 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#11 $
*/ */
#include "aic79xx_osm.h" #include "aic79xx_osm.h"
#include "aic79xx_inline.h" #include "aic79xx_inline.h"
...@@ -103,7 +103,7 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) ...@@ -103,7 +103,7 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)
u_int mb; u_int mb;
if (tinfo->period == AHD_PERIOD_UNKNOWN) { if (tinfo->period == AHD_PERIOD_UNKNOWN) {
copy_info(info, "Renegotiation Pending"); copy_info(info, "Renegotiation Pending\n");
return; return;
} }
speed = 3300; speed = 3300;
...@@ -181,6 +181,7 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, ...@@ -181,6 +181,7 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,
ahd_format_transinfo(info, &tinfo->goal); ahd_format_transinfo(info, &tinfo->goal);
copy_info(info, "\tCurr: "); copy_info(info, "\tCurr: ");
ahd_format_transinfo(info, &tinfo->curr); ahd_format_transinfo(info, &tinfo->curr);
copy_info(info, "\tTransmission Errors %ld\n", targ->errors_detected);
for (lun = 0; lun < AHD_NUM_LUNS; lun++) { for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
struct ahd_linux_device *dev; struct ahd_linux_device *dev;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated * DO NOT EDIT - This file is automatically generated
* from the following source files: * from the following source files:
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/ */
typedef int (ahd_reg_print_t)(u_int, u_int *, u_int); typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
typedef struct ahd_reg_parse_entry { typedef struct ahd_reg_parse_entry {
...@@ -82,6 +82,13 @@ ahd_reg_print_t ahd_hs_mailbox_print; ...@@ -82,6 +82,13 @@ ahd_reg_print_t ahd_hs_mailbox_print;
ahd_print_register(NULL, 0, "HS_MAILBOX", 0x0b, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "HS_MAILBOX", 0x0b, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_clrseqintstat_print;
#else
#define ahd_clrseqintstat_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "CLRSEQINTSTAT", 0x0c, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_seqintstat_print; ahd_reg_print_t ahd_seqintstat_print;
#else #else
...@@ -89,6 +96,13 @@ ahd_reg_print_t ahd_seqintstat_print; ...@@ -89,6 +96,13 @@ ahd_reg_print_t ahd_seqintstat_print;
ahd_print_register(NULL, 0, "SEQINTSTAT", 0x0c, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "SEQINTSTAT", 0x0c, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_swtimer_print;
#else
#define ahd_swtimer_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "SWTIMER", 0x0e, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_snscb_qoff_print; ahd_reg_print_t ahd_snscb_qoff_print;
#else #else
...@@ -1629,13 +1643,6 @@ ahd_reg_print_t ahd_dspfltrctl_print; ...@@ -1629,13 +1643,6 @@ ahd_reg_print_t ahd_dspfltrctl_print;
ahd_print_register(NULL, 0, "DSPFLTRCTL", 0xc0, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "DSPFLTRCTL", 0xc0, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_clrseqintstat_print;
#else
#define ahd_clrseqintstat_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "CLRSEQINTSTAT", 0xc0, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_dspdatactl_print; ahd_reg_print_t ahd_dspdatactl_print;
#else #else
...@@ -1713,13 +1720,6 @@ ahd_reg_print_t ahd_rcvrbiascalc_print; ...@@ -1713,13 +1720,6 @@ ahd_reg_print_t ahd_rcvrbiascalc_print;
ahd_print_register(NULL, 0, "RCVRBIASCALC", 0xc8, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "RCVRBIASCALC", 0xc8, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_dfdbctl_print;
#else
#define ahd_dfdbctl_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "DFDBCTL", 0xc8, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_dfbkptr_print; ahd_reg_print_t ahd_dfbkptr_print;
#else #else
...@@ -1734,6 +1734,13 @@ ahd_reg_print_t ahd_skewcalc_print; ...@@ -1734,6 +1734,13 @@ ahd_reg_print_t ahd_skewcalc_print;
ahd_print_register(NULL, 0, "SKEWCALC", 0xc9, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "SKEWCALC", 0xc9, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_dfdbctl_print;
#else
#define ahd_dfdbctl_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "DFDBCTL", 0xcb, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_dfscnt_print; ahd_reg_print_t ahd_dfscnt_print;
#else #else
...@@ -1797,13 +1804,6 @@ ahd_reg_print_t ahd_prgmcnt_print; ...@@ -1797,13 +1804,6 @@ ahd_reg_print_t ahd_prgmcnt_print;
ahd_print_register(NULL, 0, "PRGMCNT", 0xde, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "PRGMCNT", 0xde, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_swtimer_print;
#else
#define ahd_swtimer_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "SWTIMER", 0xe0, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_accum_print; ahd_reg_print_t ahd_accum_print;
#else #else
...@@ -2140,11 +2140,53 @@ ahd_reg_print_t ahd_allocfifo_scbptr_print; ...@@ -2140,11 +2140,53 @@ ahd_reg_print_t ahd_allocfifo_scbptr_print;
ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", 0x148, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", 0x148, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_timer_print;
#else
#define ahd_int_coalessing_timer_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_TIMER", 0x14a, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_maxcmds_print;
#else
#define ahd_int_coalessing_maxcmds_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_MAXCMDS", 0x14c, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_mincmds_print;
#else
#define ahd_int_coalessing_mincmds_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_MINCMDS", 0x14d, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_cmds_pending_print;
#else
#define ahd_cmds_pending_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "CMDS_PENDING", 0x14e, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_cmdcount_print;
#else
#define ahd_int_coalessing_cmdcount_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_CMDCOUNT", 0x150, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_local_hs_mailbox_print;
#else
#define ahd_local_hs_mailbox_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "LOCAL_HS_MAILBOX", 0x151, regvalue, cur_col, wrap)
#endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_cmdsize_table_print; ahd_reg_print_t ahd_cmdsize_table_print;
#else #else
#define ahd_cmdsize_table_print(regvalue, cur_col, wrap) \ #define ahd_cmdsize_table_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "CMDSIZE_TABLE", 0x14a, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "CMDSIZE_TABLE", 0x152, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
...@@ -2394,6 +2436,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -2394,6 +2436,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define HS_MAILBOX 0x0b #define HS_MAILBOX 0x0b
#define HOST_TQINPOS 0x80 #define HOST_TQINPOS 0x80
#define ENINT_COALESS 0x40
#define CLRSEQINTSTAT 0x0c
#define CLRSEQ_SWTMRTO 0x10
#define CLRSEQ_SEQINT 0x08
#define CLRSEQ_SCSIINT 0x04
#define CLRSEQ_PCIINT 0x02
#define CLRSEQ_SPLTINT 0x01
#define SEQINTSTAT 0x0c #define SEQINTSTAT 0x0c
#define SEQ_SWTMRTO 0x10 #define SEQ_SWTMRTO 0x10
...@@ -2402,6 +2452,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -2402,6 +2452,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define SEQ_PCIINT 0x02 #define SEQ_PCIINT 0x02
#define SEQ_SPLTINT 0x01 #define SEQ_SPLTINT 0x01
#define SWTIMER 0x0e
#define SNSCB_QOFF 0x10 #define SNSCB_QOFF 0x10
#define SESCB_QOFF 0x12 #define SESCB_QOFF 0x12
...@@ -3332,13 +3384,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3332,13 +3384,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define EDGESENSE 0x10 #define EDGESENSE 0x10
#define DSPFCNTSEL 0x0f #define DSPFCNTSEL 0x0f
#define CLRSEQINTSTAT 0xc0
#define CLRSEQ_SWTMRTO 0x10
#define CLRSEQ_SEQINT 0x08
#define CLRSEQ_SCSIINT 0x04
#define CLRSEQ_PCIINT 0x02
#define CLRSEQ_SPLTINT 0x01
#define DSPDATACTL 0xc1 #define DSPDATACTL 0xc1
#define BYPASSENAB 0x80 #define BYPASSENAB 0x80
#define DESQDIS 0x10 #define DESQDIS 0x10
...@@ -3375,7 +3420,11 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3375,7 +3420,11 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define RCVRBIASCALC 0xc8 #define RCVRBIASCALC 0xc8
#define DFDBCTL 0xc8 #define DFBKPTR 0xc9
#define SKEWCALC 0xc9
#define DFDBCTL 0xcb
#define DFF_CIO_WR_RDY 0x20 #define DFF_CIO_WR_RDY 0x20
#define DFF_CIO_RD_RDY 0x10 #define DFF_CIO_RD_RDY 0x10
#define DFF_DIR_ERR 0x08 #define DFF_DIR_ERR 0x08
...@@ -3383,10 +3432,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3383,10 +3432,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define DFF_RAMBIST_DONE 0x02 #define DFF_RAMBIST_DONE 0x02
#define DFF_RAMBIST_EN 0x01 #define DFF_RAMBIST_EN 0x01
#define DFBKPTR 0xc9
#define SKEWCALC 0xc9
#define DFSCNT 0xcc #define DFSCNT 0xcc
#define DFBCNT 0xce #define DFBCNT 0xce
...@@ -3418,15 +3463,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3418,15 +3463,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define INT1_CONTEXT 0x20 #define INT1_CONTEXT 0x20
#define SCS_SEQ_INT1M1 0x10 #define SCS_SEQ_INT1M1 0x10
#define SCS_SEQ_INT1M0 0x08 #define SCS_SEQ_INT1M0 0x08
#define INTMASK 0x06 #define INTMASK2 0x04
#define INTMASK1 0x02
#define IRET 0x01 #define IRET 0x01
#define SEQRAM 0xda #define SEQRAM 0xda
#define PRGMCNT 0xde #define PRGMCNT 0xde
#define SWTIMER 0xe0
#define ACCUM 0xe0 #define ACCUM 0xe0
#define SINDEX 0xe2 #define SINDEX 0xe2
...@@ -3574,7 +3618,19 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3574,7 +3618,19 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define ALLOCFIFO_SCBPTR 0x148 #define ALLOCFIFO_SCBPTR 0x148
#define CMDSIZE_TABLE 0x14a #define INT_COALESSING_TIMER 0x14a
#define INT_COALESSING_MAXCMDS 0x14c
#define INT_COALESSING_MINCMDS 0x14d
#define CMDS_PENDING 0x14e
#define INT_COALESSING_CMDCOUNT 0x150
#define LOCAL_HS_MAILBOX 0x151
#define CMDSIZE_TABLE 0x152
#define SCB_BASE 0x180 #define SCB_BASE 0x180
...@@ -3646,6 +3702,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3646,6 +3702,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define SCB_DISCONNECTED_LISTS 0x1b8 #define SCB_DISCONNECTED_LISTS 0x1b8
#define AHD_TIMER_US_PER_TICK 0x19
#define SCB_TRANSFER_SIZE_FULL_LUN 0x38 #define SCB_TRANSFER_SIZE_FULL_LUN 0x38
#define STATUS_QUEUE_FULL 0x28 #define STATUS_QUEUE_FULL 0x28
#define STATUS_BUSY 0x08 #define STATUS_BUSY 0x08
...@@ -3667,6 +3724,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3667,6 +3724,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define AHD_NUM_PER_DEV_ANNEXCOLS 0x04 #define AHD_NUM_PER_DEV_ANNEXCOLS 0x04
#define B_CURRFIFO_0 0x02 #define B_CURRFIFO_0 0x02
#define NVRAM_SCB_OFFSET 0x2c #define NVRAM_SCB_OFFSET 0x2c
#define AHD_TIMER_MAX_US 0x18ffe7
#define AHD_TIMER_MAX_TICKS 0xffff
#define STATUS_PKT_SENSE 0xff #define STATUS_PKT_SENSE 0xff
#define CMD_GROUP_CODE_SHIFT 0x05 #define CMD_GROUP_CODE_SHIFT 0x05
#define AHD_SENSE_BUFSIZE 0x100 #define AHD_SENSE_BUFSIZE 0x100
...@@ -3713,4 +3772,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3713,4 +3772,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
/* Exported Labels */ /* Exported Labels */
#define LABEL_seq_isr 0x23b #define LABEL_seq_isr 0x25a
#define LABEL_timer_isr 0x256
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated * DO NOT EDIT - This file is automatically generated
* from the following source files: * from the following source files:
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/ */
#include "aic79xx_osm.h" #include "aic79xx_osm.h"
...@@ -158,16 +158,32 @@ ahd_hescb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -158,16 +158,32 @@ ahd_hescb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap)
} }
static ahd_reg_parse_entry_t HS_MAILBOX_parse_table[] = { static ahd_reg_parse_entry_t HS_MAILBOX_parse_table[] = {
{ "ENINT_COALESS", 0x40, 0x40 },
{ "HOST_TQINPOS", 0x80, 0x80 } { "HOST_TQINPOS", 0x80, 0x80 }
}; };
int int
ahd_hs_mailbox_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_hs_mailbox_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(HS_MAILBOX_parse_table, 1, "HS_MAILBOX", return (ahd_print_register(HS_MAILBOX_parse_table, 2, "HS_MAILBOX",
0x0b, regvalue, cur_col, wrap)); 0x0b, regvalue, cur_col, wrap));
} }
static ahd_reg_parse_entry_t CLRSEQINTSTAT_parse_table[] = {
{ "CLRSEQ_SPLTINT", 0x01, 0x01 },
{ "CLRSEQ_PCIINT", 0x02, 0x02 },
{ "CLRSEQ_SCSIINT", 0x04, 0x04 },
{ "CLRSEQ_SEQINT", 0x08, 0x08 },
{ "CLRSEQ_SWTMRTO", 0x10, 0x10 }
};
int
ahd_clrseqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(CLRSEQINTSTAT_parse_table, 5, "CLRSEQINTSTAT",
0x0c, regvalue, cur_col, wrap));
}
static ahd_reg_parse_entry_t SEQINTSTAT_parse_table[] = { static ahd_reg_parse_entry_t SEQINTSTAT_parse_table[] = {
{ "SEQ_SPLTINT", 0x01, 0x01 }, { "SEQ_SPLTINT", 0x01, 0x01 },
{ "SEQ_PCIINT", 0x02, 0x02 }, { "SEQ_PCIINT", 0x02, 0x02 },
...@@ -183,6 +199,13 @@ ahd_seqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -183,6 +199,13 @@ ahd_seqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap)
0x0c, regvalue, cur_col, wrap)); 0x0c, regvalue, cur_col, wrap));
} }
int
ahd_swtimer_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "SWTIMER",
0x0e, regvalue, cur_col, wrap));
}
int int
ahd_snscb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_snscb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
...@@ -2714,21 +2737,6 @@ ahd_dspfltrctl_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -2714,21 +2737,6 @@ ahd_dspfltrctl_print(u_int regvalue, u_int *cur_col, u_int wrap)
0xc0, regvalue, cur_col, wrap)); 0xc0, regvalue, cur_col, wrap));
} }
static ahd_reg_parse_entry_t CLRSEQINTSTAT_parse_table[] = {
{ "CLRSEQ_SPLTINT", 0x01, 0x01 },
{ "CLRSEQ_PCIINT", 0x02, 0x02 },
{ "CLRSEQ_SCSIINT", 0x04, 0x04 },
{ "CLRSEQ_SEQINT", 0x08, 0x08 },
{ "CLRSEQ_SWTMRTO", 0x10, 0x10 }
};
int
ahd_clrseqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(CLRSEQINTSTAT_parse_table, 5, "CLRSEQINTSTAT",
0xc0, regvalue, cur_col, wrap));
}
static ahd_reg_parse_entry_t DSPDATACTL_parse_table[] = { static ahd_reg_parse_entry_t DSPDATACTL_parse_table[] = {
{ "XMITOFFSTDIS", 0x02, 0x02 }, { "XMITOFFSTDIS", 0x02, 0x02 },
{ "RCVROFFSTDIS", 0x04, 0x04 }, { "RCVROFFSTDIS", 0x04, 0x04 },
...@@ -2838,6 +2846,20 @@ ahd_rcvrbiascalc_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -2838,6 +2846,20 @@ ahd_rcvrbiascalc_print(u_int regvalue, u_int *cur_col, u_int wrap)
0xc8, regvalue, cur_col, wrap)); 0xc8, regvalue, cur_col, wrap));
} }
int
ahd_dfbkptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "DFBKPTR",
0xc9, regvalue, cur_col, wrap));
}
int
ahd_skewcalc_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "SKEWCALC",
0xc9, regvalue, cur_col, wrap));
}
static ahd_reg_parse_entry_t DFDBCTL_parse_table[] = { static ahd_reg_parse_entry_t DFDBCTL_parse_table[] = {
{ "DFF_RAMBIST_EN", 0x01, 0x01 }, { "DFF_RAMBIST_EN", 0x01, 0x01 },
{ "DFF_RAMBIST_DONE", 0x02, 0x02 }, { "DFF_RAMBIST_DONE", 0x02, 0x02 },
...@@ -2851,21 +2873,7 @@ int ...@@ -2851,21 +2873,7 @@ int
ahd_dfdbctl_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_dfdbctl_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(DFDBCTL_parse_table, 6, "DFDBCTL", return (ahd_print_register(DFDBCTL_parse_table, 6, "DFDBCTL",
0xc8, regvalue, cur_col, wrap)); 0xcb, regvalue, cur_col, wrap));
}
int
ahd_dfbkptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "DFBKPTR",
0xc9, regvalue, cur_col, wrap));
}
int
ahd_skewcalc_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "SKEWCALC",
0xc9, regvalue, cur_col, wrap));
} }
int int
...@@ -2935,7 +2943,8 @@ ahd_flags_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -2935,7 +2943,8 @@ ahd_flags_print(u_int regvalue, u_int *cur_col, u_int wrap)
static ahd_reg_parse_entry_t SEQINTCTL_parse_table[] = { static ahd_reg_parse_entry_t SEQINTCTL_parse_table[] = {
{ "IRET", 0x01, 0x01 }, { "IRET", 0x01, 0x01 },
{ "INTMASK", 0x06, 0x06 }, { "INTMASK1", 0x02, 0x02 },
{ "INTMASK2", 0x04, 0x04 },
{ "SCS_SEQ_INT1M0", 0x08, 0x08 }, { "SCS_SEQ_INT1M0", 0x08, 0x08 },
{ "SCS_SEQ_INT1M1", 0x10, 0x10 }, { "SCS_SEQ_INT1M1", 0x10, 0x10 },
{ "INT1_CONTEXT", 0x20, 0x20 }, { "INT1_CONTEXT", 0x20, 0x20 },
...@@ -2945,7 +2954,7 @@ static ahd_reg_parse_entry_t SEQINTCTL_parse_table[] = { ...@@ -2945,7 +2954,7 @@ static ahd_reg_parse_entry_t SEQINTCTL_parse_table[] = {
int int
ahd_seqintctl_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_seqintctl_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(SEQINTCTL_parse_table, 6, "SEQINTCTL", return (ahd_print_register(SEQINTCTL_parse_table, 7, "SEQINTCTL",
0xd9, regvalue, cur_col, wrap)); 0xd9, regvalue, cur_col, wrap));
} }
...@@ -2963,13 +2972,6 @@ ahd_prgmcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -2963,13 +2972,6 @@ ahd_prgmcnt_print(u_int regvalue, u_int *cur_col, u_int wrap)
0xde, regvalue, cur_col, wrap)); 0xde, regvalue, cur_col, wrap));
} }
int
ahd_swtimer_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "SWTIMER",
0xe0, regvalue, cur_col, wrap));
}
int int
ahd_accum_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_accum_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
...@@ -3376,11 +3378,53 @@ ahd_allocfifo_scbptr_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -3376,11 +3378,53 @@ ahd_allocfifo_scbptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
0x148, regvalue, cur_col, wrap)); 0x148, regvalue, cur_col, wrap));
} }
int
ahd_int_coalessing_timer_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "INT_COALESSING_TIMER",
0x14a, regvalue, cur_col, wrap));
}
int
ahd_int_coalessing_maxcmds_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "INT_COALESSING_MAXCMDS",
0x14c, regvalue, cur_col, wrap));
}
int
ahd_int_coalessing_mincmds_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "INT_COALESSING_MINCMDS",
0x14d, regvalue, cur_col, wrap));
}
int
ahd_cmds_pending_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "CMDS_PENDING",
0x14e, regvalue, cur_col, wrap));
}
int
ahd_int_coalessing_cmdcount_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "INT_COALESSING_CMDCOUNT",
0x150, regvalue, cur_col, wrap));
}
int
ahd_local_hs_mailbox_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "LOCAL_HS_MAILBOX",
0x151, regvalue, cur_col, wrap));
}
int int
ahd_cmdsize_table_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_cmdsize_table_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(NULL, 0, "CMDSIZE_TABLE", return (ahd_print_register(NULL, 0, "CMDSIZE_TABLE",
0x14a, regvalue, cur_col, wrap)); 0x152, regvalue, cur_col, wrap));
} }
int int
......
...@@ -2,104 +2,128 @@ ...@@ -2,104 +2,128 @@
* DO NOT EDIT - This file is automatically generated * DO NOT EDIT - This file is automatically generated
* from the following source files: * from the following source files:
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/ */
static uint8_t seqprog[] = { static uint8_t seqprog[] = {
0xff, 0x02, 0x06, 0x78, 0xff, 0x02, 0x06, 0x78,
0x00, 0xea, 0x06, 0x59, 0x00, 0xea, 0x3c, 0x59,
0x01, 0xea, 0x04, 0x30, 0x01, 0xea, 0x04, 0x30,
0xff, 0x04, 0x0c, 0x78, 0xff, 0x04, 0x0c, 0x78,
0x17, 0xea, 0x06, 0x59, 0x17, 0xea, 0x3c, 0x59,
0x17, 0xea, 0x04, 0x00, 0x17, 0xea, 0x04, 0x00,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x60, 0x3a, 0x1a, 0x68, 0x60, 0x3a, 0x1a, 0x68,
0x04, 0x47, 0x1b, 0x68, 0x04, 0x47, 0x1b, 0x68,
0xff, 0x21, 0x1b, 0x70, 0xff, 0x21, 0x1b, 0x70,
0x40, 0x4b, 0x48, 0x69, 0x40, 0x4b, 0x7e, 0x69,
0x00, 0xe2, 0x0a, 0x59, 0x00, 0xe2, 0x40, 0x59,
0x40, 0x4b, 0x48, 0x69, 0x40, 0x4b, 0x7e, 0x69,
0x20, 0x4b, 0x38, 0x69, 0x20, 0x4b, 0x6e, 0x69,
0xfc, 0x42, 0x24, 0x78, 0xfc, 0x42, 0x24, 0x78,
0x10, 0x40, 0x24, 0x78, 0x10, 0x40, 0x24, 0x78,
0x00, 0xe2, 0x4e, 0x5d, 0x00, 0xe2, 0x8c, 0x5d,
0x20, 0x4d, 0x28, 0x78, 0x20, 0x4d, 0x28, 0x78,
0x00, 0xe2, 0x4e, 0x5d, 0x00, 0xe2, 0x8c, 0x5d,
0x00, 0xe2, 0x34, 0x58, 0x00, 0xe2, 0x34, 0x58,
0x00, 0xe2, 0x5c, 0x58, 0x00, 0xe2, 0x5c, 0x58,
0x00, 0xe2, 0x6c, 0x58, 0x00, 0xe2, 0x6c, 0x58,
0x00, 0xe2, 0x06, 0x40, 0x00, 0xe2, 0x06, 0x40,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x01, 0x52, 0x10, 0x7d, 0x01, 0x52, 0x4e, 0x7d,
0x02, 0x58, 0x50, 0x31, 0x02, 0x58, 0x50, 0x31,
0xff, 0xea, 0x10, 0x0b, 0xff, 0xea, 0x10, 0x0b,
0x08, 0xa8, 0x51, 0x03, 0x08, 0xa8, 0x51, 0x03,
0x01, 0xa4, 0x43, 0x78, 0x01, 0xa4, 0x43, 0x78,
0x00, 0xe2, 0xfc, 0x5a, 0x00, 0xe2, 0x32, 0x5b,
0x00, 0xe2, 0x34, 0x40, 0x00, 0xe2, 0x34, 0x40,
0xff, 0xea, 0xd4, 0x19, 0xff, 0xea, 0xd4, 0x19,
0x02, 0xa8, 0x84, 0x32, 0x02, 0xa8, 0x84, 0x32,
0x00, 0xea, 0xfa, 0x58, 0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30, 0x01, 0xea, 0x00, 0x30,
0x00, 0xe2, 0x42, 0x5d, 0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0x10, 0x4d, 0x00, 0xe2, 0x4e, 0x4d,
0x11, 0xea, 0xfa, 0x58, 0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00, 0x11, 0xea, 0x00, 0x00,
0x00, 0xe2, 0x42, 0x5d, 0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0x10, 0x4d, 0x00, 0xe2, 0x4e, 0x4d,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x00, 0xe2, 0xf2, 0x42, 0x00, 0xe2, 0x28, 0x43,
0x00, 0xea, 0xfa, 0x58, 0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30, 0x01, 0xea, 0x00, 0x30,
0x80, 0xf9, 0x64, 0x68, 0x80, 0xf9, 0x64, 0x68,
0x00, 0xe2, 0xf8, 0x58, 0x00, 0xe2, 0x2e, 0x59,
0x11, 0xea, 0xfa, 0x58, 0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00, 0x11, 0xea, 0x00, 0x00,
0x80, 0xf9, 0xf8, 0x78, 0x80, 0xf9, 0x2e, 0x79,
0xff, 0xea, 0xd4, 0x0d, 0xff, 0xea, 0xd4, 0x0d,
0x22, 0xea, 0xfa, 0x58, 0x22, 0xea, 0x30, 0x59,
0x22, 0xea, 0x00, 0x00, 0x22, 0xea, 0x00, 0x00,
0x18, 0xad, 0xb4, 0x78, 0x10, 0x16, 0x76, 0x78,
0x04, 0xad, 0x88, 0x68, 0x01, 0x0b, 0xa2, 0x32,
0x80, 0xad, 0x10, 0x7d, 0x10, 0x16, 0x2c, 0x00,
0x10, 0xad, 0x7a, 0x78, 0x18, 0xad, 0xe4, 0x78,
0x04, 0xad, 0xb2, 0x68,
0x80, 0xad, 0x4e, 0x7d,
0x10, 0xad, 0x80, 0x78,
0xe7, 0xad, 0x5a, 0x0d, 0xe7, 0xad, 0x5a, 0x0d,
0xe7, 0xad, 0x5a, 0x09, 0xe7, 0xad, 0x5a, 0x09,
0x02, 0xea, 0x02, 0x00, 0x00, 0xe2, 0x8e, 0x58,
0xff, 0xea, 0x56, 0x02, 0xff, 0xea, 0x56, 0x02,
0x04, 0x7c, 0x78, 0x32, 0x04, 0x7c, 0x78, 0x32,
0x20, 0x16, 0x10, 0x7d, 0x20, 0x16, 0x4e, 0x7d,
0x04, 0x38, 0x79, 0x32, 0x04, 0x38, 0x79, 0x32,
0x80, 0x37, 0x6f, 0x16, 0x80, 0x37, 0x6f, 0x16,
0x40, 0xad, 0x10, 0x7d, 0xff, 0x2d, 0x9d, 0x60,
0xff, 0x29, 0x9d, 0x60,
0x40, 0x51, 0xad, 0x78,
0xff, 0x4f, 0x9d, 0x68,
0xff, 0x4d, 0xc1, 0x19,
0x00, 0x4e, 0xd5, 0x19,
0x00, 0xe2, 0xac, 0x50,
0x01, 0x4c, 0xc1, 0x31,
0x00, 0x50, 0xd5, 0x19,
0x00, 0xe2, 0xac, 0x48,
0x80, 0x18, 0x4e, 0x7d,
0x02, 0x4a, 0x1d, 0x30,
0x10, 0xea, 0x18, 0x00,
0x60, 0x18, 0x30, 0x00,
0x7f, 0x18, 0x30, 0x0c,
0x02, 0xea, 0x02, 0x00,
0xff, 0xea, 0xa0, 0x0a,
0x80, 0x18, 0x30, 0x04,
0x40, 0xad, 0x4e, 0x7d,
0xe7, 0xad, 0x5a, 0x09, 0xe7, 0xad, 0x5a, 0x09,
0x02, 0xa8, 0x40, 0x31, 0x02, 0xa8, 0x40, 0x31,
0xff, 0xea, 0xc0, 0x09,
0x01, 0x4e, 0x9d, 0x1a,
0x00, 0x4f, 0x9f, 0x22,
0x04, 0x94, 0x49, 0x32, 0x04, 0x94, 0x49, 0x32,
0xff, 0xea, 0x2a, 0x03, 0xff, 0xea, 0x2a, 0x03,
0xff, 0xea, 0x2e, 0x03, 0xff, 0xea, 0x2e, 0x03,
0x01, 0x10, 0xd4, 0x31, 0x01, 0x10, 0xd4, 0x31,
0x10, 0xa8, 0xa9, 0x68, 0x10, 0xa8, 0xd9, 0x68,
0x3d, 0xa9, 0xc5, 0x29, 0x3d, 0xa9, 0xc5, 0x29,
0xfe, 0xe2, 0xc4, 0x09, 0xfe, 0xe2, 0xc4, 0x09,
0x01, 0xea, 0xc6, 0x01, 0x01, 0xea, 0xc6, 0x01,
0x02, 0xe2, 0xc8, 0x31, 0x02, 0xe2, 0xc8, 0x31,
0x02, 0xec, 0x50, 0x31, 0x02, 0xec, 0x50, 0x31,
0x02, 0xa0, 0xda, 0x31, 0x02, 0xa0, 0xda, 0x31,
0xff, 0xa9, 0xa8, 0x70, 0xff, 0xa9, 0xd8, 0x70,
0x02, 0xa0, 0x28, 0x37, 0x02, 0xa0, 0x28, 0x37,
0xff, 0x21, 0xb1, 0x70, 0xff, 0x21, 0xe1, 0x70,
0x02, 0x22, 0x51, 0x31, 0x02, 0x22, 0x51, 0x31,
0x02, 0xa0, 0x2c, 0x33, 0x02, 0xa0, 0x2c, 0x33,
0x02, 0xa0, 0x44, 0x36, 0x02, 0xa0, 0x44, 0x36,
0x02, 0xa0, 0x40, 0x32, 0x02, 0xa0, 0x40, 0x32,
0x02, 0xa0, 0x44, 0x36, 0x02, 0xa0, 0x44, 0x36,
0x04, 0x47, 0xb9, 0x68, 0x04, 0x47, 0xe9, 0x68,
0x40, 0x16, 0xde, 0x68, 0x40, 0x16, 0x14, 0x69,
0xff, 0x2d, 0xe3, 0x60, 0xff, 0x2d, 0x19, 0x61,
0xff, 0x29, 0x11, 0x75, 0xff, 0x29, 0x4f, 0x75,
0x01, 0x37, 0xc1, 0x31, 0x01, 0x37, 0xc1, 0x31,
0x02, 0x28, 0x55, 0x32, 0x02, 0x28, 0x55, 0x32,
0x01, 0xea, 0x5a, 0x01, 0x01, 0xea, 0x5a, 0x01,
...@@ -108,20 +132,23 @@ static uint8_t seqprog[] = { ...@@ -108,20 +132,23 @@ static uint8_t seqprog[] = {
0x01, 0xa8, 0x60, 0x31, 0x01, 0xa8, 0x60, 0x31,
0x00, 0xa9, 0x60, 0x01, 0x00, 0xa9, 0x60, 0x01,
0x01, 0x14, 0xd4, 0x31, 0x01, 0x14, 0xd4, 0x31,
0xff, 0x8d, 0xd7, 0x70, 0x01, 0x50, 0xa1, 0x1a,
0x80, 0xac, 0xd6, 0x70, 0xff, 0x4e, 0x9d, 0x1a,
0x20, 0x16, 0xd6, 0x68, 0xff, 0x4f, 0x9f, 0x22,
0xff, 0x8d, 0x0d, 0x71,
0x80, 0xac, 0x0c, 0x71,
0x20, 0x16, 0x0c, 0x69,
0x02, 0x8c, 0x51, 0x31, 0x02, 0x8c, 0x51, 0x31,
0x00, 0xe2, 0xc6, 0x40, 0x00, 0xe2, 0xf6, 0x40,
0x01, 0xac, 0x08, 0x31, 0x01, 0xac, 0x08, 0x31,
0x09, 0xea, 0x5a, 0x01, 0x09, 0xea, 0x5a, 0x01,
0x02, 0x8c, 0x51, 0x32, 0x02, 0x8c, 0x51, 0x32,
0xff, 0xea, 0x1a, 0x07, 0xff, 0xea, 0x1a, 0x07,
0x04, 0x24, 0xf9, 0x30, 0x04, 0x24, 0xf9, 0x30,
0x1d, 0xea, 0xee, 0x40, 0x1d, 0xea, 0x24, 0x41,
0x02, 0x2c, 0x51, 0x31, 0x02, 0x2c, 0x51, 0x31,
0x04, 0xac, 0xf9, 0x30, 0x04, 0xac, 0xf9, 0x30,
0x19, 0xea, 0xee, 0x58, 0x19, 0xea, 0x24, 0x59,
0x02, 0x8c, 0x59, 0x32, 0x02, 0x8c, 0x59, 0x32,
0x02, 0x28, 0x19, 0x33, 0x02, 0x28, 0x19, 0x33,
0x02, 0xa8, 0x50, 0x36, 0x02, 0xa8, 0x50, 0x36,
...@@ -143,23 +170,23 @@ static uint8_t seqprog[] = { ...@@ -143,23 +170,23 @@ static uint8_t seqprog[] = {
0x02, 0x20, 0xb9, 0x30, 0x02, 0x20, 0xb9, 0x30,
0x02, 0x20, 0x51, 0x31, 0x02, 0x20, 0x51, 0x31,
0x4c, 0xa9, 0xd7, 0x28, 0x4c, 0xa9, 0xd7, 0x28,
0x10, 0xa8, 0x19, 0x79, 0x10, 0xa8, 0x4f, 0x79,
0x01, 0x6b, 0xc0, 0x30, 0x01, 0x6b, 0xc0, 0x30,
0x02, 0x64, 0xc8, 0x00, 0x02, 0x64, 0xc8, 0x00,
0x40, 0x3a, 0x74, 0x04, 0x40, 0x3a, 0x74, 0x04,
0x00, 0xe2, 0x5c, 0x58, 0x00, 0xe2, 0x5c, 0x58,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x30, 0x3f, 0xc0, 0x09, 0x30, 0x3f, 0xc0, 0x09,
0x30, 0xe0, 0x1a, 0x61, 0x30, 0xe0, 0x50, 0x61,
0x20, 0x3f, 0x30, 0x69, 0x20, 0x3f, 0x66, 0x69,
0x10, 0x3f, 0x1a, 0x79, 0x10, 0x3f, 0x50, 0x79,
0x02, 0xea, 0x7e, 0x00, 0x02, 0xea, 0x7e, 0x00,
0x00, 0xea, 0xfa, 0x58, 0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30, 0x01, 0xea, 0x00, 0x30,
0x02, 0x48, 0x51, 0x35, 0x02, 0x48, 0x51, 0x35,
0x01, 0xea, 0x7e, 0x00, 0x01, 0xea, 0x7e, 0x00,
0x11, 0xea, 0xfa, 0x58, 0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00, 0x11, 0xea, 0x00, 0x00,
0x02, 0x48, 0x51, 0x35, 0x02, 0x48, 0x51, 0x35,
0x08, 0xea, 0x98, 0x00, 0x08, 0xea, 0x98, 0x00,
...@@ -169,11 +196,11 @@ static uint8_t seqprog[] = { ...@@ -169,11 +196,11 @@ static uint8_t seqprog[] = {
0x0f, 0x67, 0xc0, 0x09, 0x0f, 0x67, 0xc0, 0x09,
0x00, 0x34, 0x69, 0x02, 0x00, 0x34, 0x69, 0x02,
0x20, 0xea, 0x96, 0x00, 0x20, 0xea, 0x96, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x40, 0x3a, 0x64, 0x69, 0x40, 0x3a, 0x9a, 0x69,
0x02, 0x55, 0x06, 0x68, 0x02, 0x55, 0x06, 0x68,
0x02, 0x56, 0x64, 0x69, 0x02, 0x56, 0x9a, 0x69,
0xff, 0x5b, 0x64, 0x61, 0xff, 0x5b, 0x9a, 0x61,
0x02, 0x20, 0x51, 0x31, 0x02, 0x20, 0x51, 0x31,
0x80, 0xea, 0xb2, 0x01, 0x80, 0xea, 0xb2, 0x01,
0x44, 0xea, 0x00, 0x00, 0x44, 0xea, 0x00, 0x00,
...@@ -181,33 +208,33 @@ static uint8_t seqprog[] = { ...@@ -181,33 +208,33 @@ static uint8_t seqprog[] = {
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0xff, 0xea, 0xb2, 0x09, 0xff, 0xea, 0xb2, 0x09,
0xff, 0xe0, 0xc0, 0x19, 0xff, 0xe0, 0xc0, 0x19,
0xff, 0xe0, 0x66, 0x79, 0xff, 0xe0, 0x9c, 0x79,
0x02, 0x94, 0x51, 0x31, 0x02, 0x94, 0x51, 0x31,
0x00, 0xe2, 0x5c, 0x41, 0x00, 0xe2, 0x92, 0x41,
0x02, 0x5e, 0x50, 0x31, 0x02, 0x5e, 0x50, 0x31,
0x02, 0xa8, 0xb8, 0x30, 0x02, 0xa8, 0xb8, 0x30,
0x02, 0x5c, 0x50, 0x31, 0x02, 0x5c, 0x50, 0x31,
0xff, 0x95, 0x77, 0x71, 0xff, 0x95, 0xad, 0x71,
0x02, 0x94, 0x41, 0x31, 0x02, 0x94, 0x41, 0x31,
0x02, 0x22, 0x51, 0x31, 0x02, 0x22, 0x51, 0x31,
0x02, 0xa0, 0x2c, 0x33, 0x02, 0xa0, 0x2c, 0x33,
0x02, 0xa0, 0x44, 0x32, 0x02, 0xa0, 0x44, 0x32,
0x00, 0xe2, 0x80, 0x41, 0x00, 0xe2, 0xb6, 0x41,
0x10, 0xa8, 0x81, 0x69, 0x10, 0xa8, 0xb7, 0x69,
0x3d, 0xa9, 0xc9, 0x29, 0x3d, 0xa9, 0xc9, 0x29,
0x01, 0xe4, 0xc8, 0x01, 0x01, 0xe4, 0xc8, 0x01,
0x01, 0xea, 0xca, 0x01, 0x01, 0xea, 0xca, 0x01,
0xff, 0xea, 0xda, 0x01, 0xff, 0xea, 0xda, 0x01,
0x02, 0x20, 0x51, 0x31, 0x02, 0x20, 0x51, 0x31,
0x02, 0x96, 0x41, 0x32, 0x02, 0x96, 0x41, 0x32,
0xff, 0x21, 0x89, 0x61, 0xff, 0x21, 0xbf, 0x61,
0xff, 0xea, 0x46, 0x02, 0xff, 0xea, 0x46, 0x02,
0x02, 0x5c, 0x50, 0x31, 0x02, 0x5c, 0x50, 0x31,
0x40, 0xea, 0x96, 0x00, 0x40, 0xea, 0x96, 0x00,
0x02, 0x56, 0x56, 0x6d, 0x02, 0x56, 0x94, 0x6d,
0x01, 0x55, 0x56, 0x6d, 0x01, 0x55, 0x94, 0x6d,
0x10, 0xa8, 0x95, 0x79, 0x10, 0xa8, 0xcb, 0x79,
0x10, 0x40, 0x96, 0x69, 0x10, 0x40, 0xcc, 0x69,
0x01, 0x56, 0x06, 0x68, 0x01, 0x56, 0x06, 0x68,
0xbf, 0x3a, 0x74, 0x08, 0xbf, 0x3a, 0x74, 0x08,
0x08, 0xea, 0x98, 0x00, 0x08, 0xea, 0x98, 0x00,
...@@ -217,104 +244,104 @@ static uint8_t seqprog[] = { ...@@ -217,104 +244,104 @@ static uint8_t seqprog[] = {
0x08, 0x3c, 0x78, 0x00, 0x08, 0x3c, 0x78, 0x00,
0x80, 0xea, 0x62, 0x02, 0x80, 0xea, 0x62, 0x02,
0x40, 0xea, 0x66, 0x02, 0x40, 0xea, 0x66, 0x02,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0x01, 0x36, 0xc1, 0x31, 0x01, 0x36, 0xc1, 0x31,
0x9f, 0xe0, 0xf0, 0x7b, 0x9f, 0xe0, 0x26, 0x7c,
0x80, 0xe0, 0xba, 0x71, 0x80, 0xe0, 0xf0, 0x71,
0xa0, 0xe0, 0xf2, 0x71, 0xa0, 0xe0, 0x28, 0x72,
0xc0, 0xe0, 0xe8, 0x71, 0xc0, 0xe0, 0x1e, 0x72,
0xe0, 0xe0, 0x22, 0x72, 0xe0, 0xe0, 0x58, 0x72,
0x01, 0xea, 0x06, 0x59, 0x01, 0xea, 0x3c, 0x59,
0x01, 0xea, 0x04, 0x00, 0x01, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x80, 0x33, 0xc1, 0x79, 0x80, 0x33, 0xf7, 0x79,
0x03, 0xea, 0x06, 0x59, 0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00, 0x03, 0xea, 0x04, 0x00,
0xee, 0x00, 0xc8, 0x69, 0xee, 0x00, 0xfe, 0x69,
0x05, 0xea, 0xb4, 0x00, 0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x02, 0xa8, 0x90, 0x32, 0x02, 0xa8, 0x90, 0x32,
0x00, 0xe2, 0x20, 0x59, 0x00, 0xe2, 0x56, 0x59,
0xef, 0x92, 0xd5, 0x19, 0xef, 0x92, 0xd5, 0x19,
0x00, 0xe2, 0xd8, 0x51, 0x00, 0xe2, 0x0e, 0x52,
0x0b, 0x84, 0xe1, 0x30, 0x0b, 0x84, 0xe1, 0x30,
0x02, 0xea, 0x36, 0x00, 0x02, 0xea, 0x36, 0x00,
0xa8, 0xea, 0x32, 0x00, 0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0xde, 0x41, 0x00, 0xe2, 0x14, 0x42,
0x01, 0x92, 0xd1, 0x30, 0x01, 0x92, 0xd1, 0x30,
0x10, 0x80, 0x89, 0x31, 0x10, 0x80, 0x89, 0x31,
0x20, 0xea, 0x32, 0x00, 0x20, 0xea, 0x32, 0x00,
0xbf, 0x33, 0x67, 0x0a, 0xbf, 0x33, 0x67, 0x0a,
0x20, 0x19, 0xe0, 0x69, 0x20, 0x19, 0x16, 0x6a,
0x02, 0x4d, 0xa6, 0x69, 0x02, 0x4d, 0xdc, 0x69,
0x40, 0x33, 0x67, 0x02, 0x40, 0x33, 0x67, 0x02,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x80, 0x33, 0x5f, 0x6a, 0x80, 0x33, 0x95, 0x6a,
0x01, 0x44, 0x10, 0x33, 0x01, 0x44, 0x10, 0x33,
0x08, 0xa8, 0x51, 0x03, 0x08, 0xa8, 0x51, 0x03,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x10, 0xea, 0x80, 0x00, 0x10, 0xea, 0x80, 0x00,
0x01, 0x31, 0xc5, 0x31, 0x01, 0x31, 0xc5, 0x31,
0x80, 0xe2, 0x0e, 0x62, 0x80, 0xe2, 0x44, 0x62,
0x10, 0xa8, 0x33, 0x6a, 0x10, 0xa8, 0x69, 0x6a,
0xc0, 0xaa, 0xc5, 0x01, 0xc0, 0xaa, 0xc5, 0x01,
0x40, 0xa8, 0xff, 0x69, 0x40, 0xa8, 0x35, 0x6a,
0xbf, 0xe2, 0xc4, 0x09, 0xbf, 0xe2, 0xc4, 0x09,
0x20, 0xa8, 0x13, 0x7a, 0x20, 0xa8, 0x49, 0x7a,
0x01, 0xe2, 0x88, 0x30, 0x01, 0xe2, 0x88, 0x30,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0x1b, 0x62, 0xa0, 0x36, 0x51, 0x62,
0x23, 0xa8, 0x89, 0x08, 0x23, 0xa8, 0x89, 0x08,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0x1b, 0x62, 0xa0, 0x36, 0x51, 0x62,
0x00, 0xa8, 0x12, 0x42, 0x00, 0xa8, 0x48, 0x42,
0xff, 0xe2, 0x12, 0x62, 0xff, 0xe2, 0x48, 0x62,
0x00, 0xe2, 0x32, 0x42, 0x00, 0xe2, 0x68, 0x42,
0x40, 0xea, 0x98, 0x00, 0x40, 0xea, 0x98, 0x00,
0x01, 0xe2, 0x88, 0x30, 0x01, 0xe2, 0x88, 0x30,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0xf1, 0x71, 0xa0, 0x36, 0x27, 0x72,
0x40, 0xea, 0x98, 0x00, 0x40, 0xea, 0x98, 0x00,
0x01, 0x31, 0x89, 0x32, 0x01, 0x31, 0x89, 0x32,
0x08, 0xea, 0x62, 0x02, 0x08, 0xea, 0x62, 0x02,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0xe0, 0xea, 0x6c, 0x5b, 0xe0, 0xea, 0xa2, 0x5b,
0x80, 0xe0, 0x6a, 0x6a, 0x80, 0xe0, 0xa0, 0x6a,
0x04, 0xe0, 0x0a, 0x73, 0x04, 0xe0, 0x40, 0x73,
0x02, 0xe0, 0x3a, 0x73, 0x02, 0xe0, 0x70, 0x73,
0x00, 0xea, 0xc8, 0x72, 0x00, 0xea, 0xfe, 0x72,
0x03, 0xe0, 0x4a, 0x73, 0x03, 0xe0, 0x80, 0x73,
0x23, 0xe0, 0x44, 0x72, 0x23, 0xe0, 0x7a, 0x72,
0x08, 0xe0, 0x66, 0x72, 0x08, 0xe0, 0x9c, 0x72,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0x07, 0xea, 0x06, 0x59, 0x07, 0xea, 0x3c, 0x59,
0x07, 0xea, 0x04, 0x00, 0x07, 0xea, 0x04, 0x00,
0x08, 0x42, 0xa7, 0x71, 0x08, 0x42, 0xdd, 0x71,
0x04, 0x42, 0x41, 0x62, 0x04, 0x42, 0x77, 0x62,
0x01, 0x43, 0x89, 0x30, 0x01, 0x43, 0x89, 0x30,
0x00, 0xe2, 0x32, 0x42, 0x00, 0xe2, 0x68, 0x42,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0x32, 0x42, 0x00, 0xe2, 0x68, 0x42,
0x01, 0x00, 0x60, 0x32, 0x01, 0x00, 0x60, 0x32,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x4c, 0x34, 0xc1, 0x28, 0x4c, 0x34, 0xc1, 0x28,
0x01, 0x64, 0xc0, 0x31, 0x01, 0x64, 0xc0, 0x31,
0x00, 0x30, 0xfb, 0x58, 0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, 0x30,
0x01, 0xe0, 0x64, 0x7a, 0x01, 0xe0, 0x9a, 0x7a,
0xa0, 0xea, 0x62, 0x5b, 0xa0, 0xea, 0x98, 0x5b,
0x01, 0xa0, 0x64, 0x62, 0x01, 0xa0, 0x9a, 0x62,
0x01, 0x84, 0x5d, 0x7a, 0x01, 0x84, 0x93, 0x7a,
0x01, 0xa7, 0x66, 0x7a, 0x01, 0xa7, 0x9c, 0x7a,
0x00, 0xe2, 0x66, 0x42, 0x00, 0xe2, 0x9c, 0x42,
0x03, 0xea, 0x06, 0x59, 0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00, 0x03, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x66, 0x42, 0x00, 0xe2, 0x9c, 0x42,
0x07, 0xea, 0x74, 0x5b, 0x07, 0xea, 0xaa, 0x5b,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x3f, 0xe0, 0x6a, 0x0a, 0x3f, 0xe0, 0x6a, 0x0a,
0xc0, 0x34, 0xc1, 0x09, 0xc0, 0x34, 0xc1, 0x09,
0x00, 0x35, 0x51, 0x01, 0x00, 0x35, 0x51, 0x01,
...@@ -325,54 +352,54 @@ static uint8_t seqprog[] = { ...@@ -325,54 +352,54 @@ static uint8_t seqprog[] = {
0x01, 0xea, 0xc6, 0x01, 0x01, 0xea, 0xc6, 0x01,
0x02, 0xe2, 0xc8, 0x31, 0x02, 0xe2, 0xc8, 0x31,
0x02, 0xec, 0x40, 0x31, 0x02, 0xec, 0x40, 0x31,
0xff, 0xa1, 0x86, 0x72, 0xff, 0xa1, 0xbc, 0x72,
0x02, 0xe8, 0xda, 0x31, 0x02, 0xe8, 0xda, 0x31,
0x02, 0xa0, 0x50, 0x31, 0x02, 0xa0, 0x50, 0x31,
0x00, 0xe2, 0xa8, 0x42, 0x00, 0xe2, 0xde, 0x42,
0x80, 0x33, 0x67, 0x02, 0x80, 0x33, 0x67, 0x02,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0x5c, 0x5b, 0x00, 0xe2, 0x92, 0x5b,
0x01, 0x33, 0x67, 0x02, 0x01, 0x33, 0x67, 0x02,
0xe0, 0x36, 0xc3, 0x62, 0xe0, 0x36, 0xf9, 0x62,
0x02, 0x33, 0x67, 0x02, 0x02, 0x33, 0x67, 0x02,
0x20, 0x46, 0xbc, 0x62, 0x20, 0x46, 0xf2, 0x62,
0xff, 0xea, 0x52, 0x09, 0xff, 0xea, 0x52, 0x09,
0xa8, 0xea, 0x62, 0x5b, 0xa8, 0xea, 0x98, 0x5b,
0x04, 0xa8, 0xa3, 0x7a, 0x04, 0xa8, 0xd9, 0x7a,
0x01, 0x34, 0xc1, 0x31, 0x01, 0x34, 0xc1, 0x31,
0x00, 0xa9, 0xa3, 0x62, 0x00, 0xa9, 0xd9, 0x62,
0x01, 0x35, 0xc1, 0x31, 0x01, 0x35, 0xc1, 0x31,
0x00, 0xaa, 0xad, 0x72, 0x00, 0xaa, 0xe3, 0x72,
0x01, 0xa9, 0x52, 0x11, 0x01, 0xa9, 0x52, 0x11,
0xff, 0xa9, 0x98, 0x6a, 0xff, 0xa9, 0xce, 0x6a,
0x00, 0xe2, 0xbc, 0x42, 0x00, 0xe2, 0xf2, 0x42,
0x10, 0x33, 0x67, 0x02, 0x10, 0x33, 0x67, 0x02,
0x04, 0xa8, 0xbd, 0x7a, 0x04, 0xa8, 0xf3, 0x7a,
0xfb, 0xa8, 0x51, 0x0b, 0xfb, 0xa8, 0x51, 0x0b,
0xff, 0xea, 0x66, 0x0a, 0xff, 0xea, 0x66, 0x0a,
0x01, 0xa4, 0xb7, 0x6a, 0x01, 0xa4, 0xed, 0x6a,
0x02, 0xa8, 0x90, 0x32, 0x02, 0xa8, 0x90, 0x32,
0x00, 0xe2, 0x20, 0x59, 0x00, 0xe2, 0x56, 0x59,
0x10, 0xa8, 0x67, 0x7a, 0x10, 0xa8, 0x9d, 0x7a,
0xff, 0xea, 0x74, 0x5b, 0xff, 0xea, 0xaa, 0x5b,
0x00, 0xe2, 0x66, 0x42, 0x00, 0xe2, 0x9c, 0x42,
0x04, 0xea, 0x06, 0x59, 0x04, 0xea, 0x3c, 0x59,
0x04, 0xea, 0x04, 0x00, 0x04, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x66, 0x42, 0x00, 0xe2, 0x9c, 0x42,
0x04, 0xea, 0x06, 0x59, 0x04, 0xea, 0x3c, 0x59,
0x04, 0xea, 0x04, 0x00, 0x04, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x08, 0xa8, 0x5f, 0x7a, 0x08, 0xa8, 0x95, 0x7a,
0xc0, 0x33, 0xd3, 0x7a, 0xc0, 0x33, 0x09, 0x7b,
0x80, 0x33, 0x5f, 0x6a, 0x80, 0x33, 0x95, 0x6a,
0xff, 0x88, 0xd3, 0x6a, 0xff, 0x88, 0x09, 0x6b,
0x40, 0x33, 0x5f, 0x6a, 0x40, 0x33, 0x95, 0x6a,
0x10, 0xa8, 0xd9, 0x7a, 0x10, 0xa8, 0x0f, 0x7b,
0x0a, 0xea, 0x06, 0x59, 0x0a, 0xea, 0x3c, 0x59,
0x0a, 0xea, 0x04, 0x00, 0x0a, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xf2, 0x5a, 0x00, 0xe2, 0x28, 0x5b,
0x00, 0xe2, 0x26, 0x43, 0x00, 0xe2, 0x5c, 0x43,
0x40, 0x4b, 0xe0, 0x6a, 0x50, 0x4b, 0x16, 0x6b,
0xbf, 0x3a, 0x74, 0x08, 0xbf, 0x3a, 0x74, 0x08,
0x01, 0xe0, 0xf8, 0x31, 0x01, 0xe0, 0xf8, 0x31,
0xff, 0xea, 0xc0, 0x09, 0xff, 0xea, 0xc0, 0x09,
...@@ -380,24 +407,24 @@ static uint8_t seqprog[] = { ...@@ -380,24 +407,24 @@ static uint8_t seqprog[] = {
0x00, 0x2f, 0x5f, 0x22, 0x00, 0x2f, 0x5f, 0x22,
0x04, 0x47, 0x8f, 0x02, 0x04, 0x47, 0x8f, 0x02,
0x01, 0xfc, 0xc0, 0x35, 0x01, 0xfc, 0xc0, 0x35,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x02, 0x42, 0x51, 0x31, 0x02, 0x42, 0x51, 0x31,
0x10, 0xa8, 0x51, 0x03, 0x10, 0xa8, 0x51, 0x03,
0xff, 0x88, 0x01, 0x6b, 0xff, 0x88, 0x37, 0x6b,
0x01, 0xa4, 0xfd, 0x6a, 0x01, 0xa4, 0x33, 0x6b,
0x02, 0xa4, 0x05, 0x6b, 0x02, 0xa4, 0x3b, 0x6b,
0x01, 0x84, 0x05, 0x7b, 0x01, 0x84, 0x3b, 0x7b,
0x02, 0x28, 0x19, 0x33, 0x02, 0x28, 0x19, 0x33,
0x02, 0xa8, 0x50, 0x36, 0x02, 0xa8, 0x50, 0x36,
0xff, 0x88, 0x05, 0x73, 0xff, 0x88, 0x3b, 0x73,
0x00, 0xe2, 0xdc, 0x5a, 0x00, 0xe2, 0x12, 0x5b,
0x02, 0x2c, 0x19, 0x33, 0x02, 0x2c, 0x19, 0x33,
0x02, 0xa8, 0x58, 0x32, 0x02, 0xa8, 0x58, 0x32,
0x04, 0xa4, 0x49, 0x07, 0x04, 0xa4, 0x49, 0x07,
0xc0, 0x33, 0x5f, 0x6a, 0xc0, 0x33, 0x95, 0x6a,
0x04, 0xa8, 0x51, 0x03, 0x04, 0xa8, 0x51, 0x03,
0x20, 0xa8, 0x27, 0x6b, 0x20, 0xa8, 0x5d, 0x6b,
0x02, 0xa8, 0x40, 0x31, 0x02, 0xa8, 0x40, 0x31,
0xc0, 0x34, 0xc1, 0x09, 0xc0, 0x34, 0xc1, 0x09,
0x00, 0x35, 0x51, 0x01, 0x00, 0x35, 0x51, 0x01,
...@@ -412,66 +439,66 @@ static uint8_t seqprog[] = { ...@@ -412,66 +439,66 @@ static uint8_t seqprog[] = {
0xf7, 0x57, 0xae, 0x08, 0xf7, 0x57, 0xae, 0x08,
0x08, 0xea, 0x98, 0x00, 0x08, 0xea, 0x98, 0x00,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0xee, 0x00, 0x30, 0x6b, 0xee, 0x00, 0x66, 0x6b,
0x02, 0xea, 0xb4, 0x00, 0x02, 0xea, 0xb4, 0x00,
0x00, 0xe2, 0x58, 0x5b, 0x00, 0xe2, 0x8e, 0x5b,
0x09, 0x4c, 0x32, 0x7b, 0x09, 0x4c, 0x68, 0x7b,
0x08, 0x4c, 0x06, 0x68, 0x08, 0x4c, 0x06, 0x68,
0x0b, 0xea, 0x06, 0x59, 0x0b, 0xea, 0x3c, 0x59,
0x0b, 0xea, 0x04, 0x00, 0x0b, 0xea, 0x04, 0x00,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0x20, 0x33, 0xa7, 0x79, 0x20, 0x33, 0xdd, 0x79,
0x00, 0xe2, 0x42, 0x5b, 0x00, 0xe2, 0x78, 0x5b,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x01, 0x84, 0x47, 0x7b, 0x01, 0x84, 0x7d, 0x7b,
0x01, 0xa4, 0x49, 0x07, 0x01, 0xa4, 0x49, 0x07,
0x08, 0x60, 0x30, 0x33, 0x08, 0x60, 0x30, 0x33,
0x08, 0x80, 0x41, 0x37, 0x08, 0x80, 0x41, 0x37,
0xdf, 0x33, 0x67, 0x0a, 0xdf, 0x33, 0x67, 0x0a,
0xee, 0x00, 0x54, 0x6b, 0xee, 0x00, 0x8a, 0x6b,
0x05, 0xea, 0xb4, 0x00, 0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x00, 0xe2, 0x20, 0x59, 0x00, 0xe2, 0x56, 0x59,
0x00, 0xe2, 0x66, 0x42, 0x00, 0xe2, 0x9c, 0x42,
0x01, 0xea, 0x6c, 0x02, 0x01, 0xea, 0x6c, 0x02,
0xc0, 0xea, 0x66, 0x06, 0xc0, 0xea, 0x66, 0x06,
0xff, 0x42, 0x5c, 0x7b, 0xff, 0x42, 0x92, 0x7b,
0x04, 0x4c, 0x5c, 0x6b, 0x04, 0x4c, 0x92, 0x6b,
0xe0, 0x41, 0x6c, 0x0e, 0xe0, 0x41, 0x6c, 0x0e,
0x01, 0x44, 0xd4, 0x31, 0x01, 0x44, 0xd4, 0x31,
0xff, 0x42, 0x64, 0x7b, 0xff, 0x42, 0x9a, 0x7b,
0x04, 0x4c, 0x64, 0x6b, 0x04, 0x4c, 0x9a, 0x6b,
0xe0, 0x41, 0x6c, 0x0a, 0xe0, 0x41, 0x6c, 0x0a,
0xe0, 0x36, 0xa7, 0x61, 0xe0, 0x36, 0xdd, 0x61,
0xff, 0xea, 0xca, 0x09, 0xff, 0xea, 0xca, 0x09,
0x01, 0xe2, 0xc8, 0x31, 0x01, 0xe2, 0xc8, 0x31,
0x01, 0x46, 0xda, 0x35, 0x01, 0x46, 0xda, 0x35,
0x01, 0x44, 0xd4, 0x35, 0x01, 0x44, 0xd4, 0x35,
0x10, 0xea, 0x80, 0x00, 0x10, 0xea, 0x80, 0x00,
0x01, 0xe2, 0x62, 0x36, 0x01, 0xe2, 0x62, 0x36,
0x04, 0xa6, 0x7c, 0x7b, 0x04, 0xa6, 0xb2, 0x7b,
0xff, 0xea, 0x5a, 0x09, 0xff, 0xea, 0x5a, 0x09,
0xff, 0xea, 0x4c, 0x0d, 0xff, 0xea, 0x4c, 0x0d,
0x01, 0xa6, 0x9a, 0x6b, 0x01, 0xa6, 0xd0, 0x6b,
0x10, 0xad, 0x10, 0x7d, 0x10, 0xad, 0x4e, 0x7d,
0x80, 0xad, 0x92, 0x6b, 0x80, 0xad, 0xc8, 0x6b,
0x08, 0xad, 0x10, 0x6d, 0x08, 0xad, 0x4e, 0x6d,
0x04, 0x84, 0xf9, 0x30, 0x04, 0x84, 0xf9, 0x30,
0x00, 0xea, 0x08, 0x81, 0x00, 0xea, 0x08, 0x81,
0xff, 0xea, 0xd4, 0x09, 0xff, 0xea, 0xd4, 0x09,
0x02, 0x84, 0xf9, 0x88, 0x02, 0x84, 0xf9, 0x88,
0x1d, 0xea, 0x5a, 0x01, 0x1d, 0xea, 0x5a, 0x01,
0x04, 0xa6, 0x4c, 0x05, 0x04, 0xa6, 0x4c, 0x05,
0x04, 0xa6, 0x10, 0x7d, 0x04, 0xa6, 0x4e, 0x7d,
0xff, 0xea, 0x5a, 0x09, 0xff, 0xea, 0x5a, 0x09,
0x03, 0x84, 0x59, 0x89, 0x03, 0x84, 0x59, 0x89,
0x03, 0xea, 0x4c, 0x01, 0x03, 0xea, 0x4c, 0x01,
0x80, 0x1a, 0x10, 0x7d, 0x80, 0x1a, 0x4e, 0x7d,
0x08, 0xb0, 0xe0, 0x30, 0x08, 0xb0, 0xe0, 0x30,
0x04, 0xb0, 0xe0, 0x30, 0x04, 0xb0, 0xe0, 0x30,
0x03, 0xb0, 0xf0, 0x30, 0x03, 0xb0, 0xf0, 0x30,
0x01, 0x78, 0xa6, 0x7b, 0x01, 0x78, 0xdc, 0x7b,
0x01, 0xa7, 0x4e, 0x11, 0x01, 0xa7, 0x4e, 0x11,
0x01, 0xb0, 0x06, 0x33, 0x01, 0xb0, 0x06, 0x33,
0x7f, 0x83, 0xe9, 0x08, 0x7f, 0x83, 0xe9, 0x08,
...@@ -482,240 +509,244 @@ static uint8_t seqprog[] = { ...@@ -482,240 +509,244 @@ static uint8_t seqprog[] = {
0x00, 0x86, 0x0d, 0x23, 0x00, 0x86, 0x0d, 0x23,
0x00, 0x87, 0x0f, 0x23, 0x00, 0x87, 0x0f, 0x23,
0x01, 0x84, 0xc5, 0x31, 0x01, 0x84, 0xc5, 0x31,
0x01, 0xa7, 0xbc, 0x7b, 0x01, 0xa7, 0xf2, 0x7b,
0x04, 0xe2, 0xc4, 0x01, 0x04, 0xe2, 0xc4, 0x01,
0x80, 0x83, 0xc3, 0x7b, 0x80, 0x83, 0xf9, 0x7b,
0x02, 0xe2, 0xc4, 0x01, 0x02, 0xe2, 0xc4, 0x01,
0xff, 0xea, 0x4c, 0x09, 0xff, 0xea, 0x4c, 0x09,
0x01, 0xe2, 0x36, 0x30, 0x01, 0xe2, 0x36, 0x30,
0xc8, 0x19, 0x32, 0x00, 0xc8, 0x19, 0x32, 0x00,
0x88, 0x19, 0x32, 0x00, 0x88, 0x19, 0x32, 0x00,
0x01, 0xac, 0xd4, 0x99, 0x01, 0xac, 0xd4, 0x99,
0x00, 0xe2, 0x10, 0x55, 0x00, 0xe2, 0x4e, 0x55,
0xfe, 0xa6, 0x4c, 0x0d, 0xfe, 0xa6, 0x4c, 0x0d,
0x0b, 0x98, 0xe1, 0x30, 0x0b, 0x98, 0xe1, 0x30,
0x01, 0xa0, 0x4f, 0x09, 0x01, 0xa0, 0x4f, 0x09,
0xfd, 0xa4, 0x49, 0x09, 0xfd, 0xa4, 0x49, 0x09,
0x80, 0xa3, 0xd9, 0x7b, 0x80, 0xa3, 0x0f, 0x7c,
0x02, 0xa4, 0x48, 0x01, 0x02, 0xa4, 0x48, 0x01,
0x01, 0xa7, 0xdc, 0x7b, 0x01, 0xa7, 0x12, 0x7c,
0x04, 0xa4, 0x48, 0x01, 0x04, 0xa4, 0x48, 0x01,
0x01, 0xa4, 0x36, 0x30, 0x01, 0xa4, 0x36, 0x30,
0xa8, 0xea, 0x32, 0x00, 0xa8, 0xea, 0x32, 0x00,
0xfd, 0xa4, 0x49, 0x0b, 0xfd, 0xa4, 0x49, 0x0b,
0x05, 0xa3, 0x07, 0x33, 0x05, 0xa3, 0x07, 0x33,
0x80, 0x83, 0xe9, 0x6b, 0x80, 0x83, 0x1f, 0x6c,
0x02, 0xea, 0x4c, 0x05, 0x02, 0xea, 0x4c, 0x05,
0xff, 0xea, 0x4c, 0x0d, 0xff, 0xea, 0x4c, 0x0d,
0x00, 0xe2, 0xf2, 0x58, 0x00, 0xe2, 0x28, 0x59,
0x02, 0xa6, 0x7e, 0x6b, 0x02, 0xa6, 0xb4, 0x6b,
0x80, 0xf9, 0xf2, 0x05, 0x80, 0xf9, 0xf2, 0x05,
0xc0, 0x33, 0xf7, 0x7b, 0xc0, 0x33, 0x2d, 0x7c,
0x03, 0xea, 0x06, 0x59, 0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00, 0x03, 0xea, 0x04, 0x00,
0x20, 0x33, 0x1b, 0x7c, 0x20, 0x33, 0x51, 0x7c,
0x01, 0x84, 0x01, 0x6c, 0x01, 0x84, 0x37, 0x6c,
0x06, 0xea, 0x06, 0x59, 0x06, 0xea, 0x3c, 0x59,
0x06, 0xea, 0x04, 0x00, 0x06, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x1e, 0x44, 0x00, 0xe2, 0x54, 0x44,
0x01, 0x00, 0x60, 0x32, 0x01, 0x00, 0x60, 0x32,
0xee, 0x00, 0x0a, 0x6c, 0xee, 0x00, 0x40, 0x6c,
0x05, 0xea, 0xb4, 0x00, 0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58, 0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00, 0x33, 0xea, 0x00, 0x00,
0x80, 0x3d, 0x7a, 0x00, 0x80, 0x3d, 0x7a, 0x00,
0xfc, 0x42, 0x0c, 0x7c, 0xfc, 0x42, 0x42, 0x7c,
0x7f, 0x3d, 0x7a, 0x08, 0x7f, 0x3d, 0x7a, 0x08,
0x00, 0x30, 0xfb, 0x58, 0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, 0x30,
0x09, 0xea, 0x06, 0x59, 0x09, 0xea, 0x3c, 0x59,
0x09, 0xea, 0x04, 0x00, 0x09, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x01, 0xa4, 0x01, 0x6c, 0x01, 0xa4, 0x37, 0x6c,
0x00, 0xe2, 0xce, 0x5b, 0x00, 0xe2, 0x04, 0x5c,
0x20, 0x33, 0x67, 0x02, 0x20, 0x33, 0x67, 0x02,
0x01, 0x00, 0x60, 0x32, 0x01, 0x00, 0x60, 0x32,
0x02, 0xa6, 0x26, 0x7c, 0x02, 0xa6, 0x5c, 0x7c,
0x00, 0xe2, 0xea, 0x5b, 0x00, 0xe2, 0x20, 0x5c,
0x00, 0xe2, 0x5c, 0x58, 0x00, 0xe2, 0x5c, 0x58,
0x00, 0xe2, 0x6c, 0x58, 0x00, 0xe2, 0x6c, 0x58,
0x00, 0xe2, 0x30, 0x58, 0x00, 0xe2, 0x30, 0x58,
0x00, 0x30, 0xfb, 0x58, 0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, 0x30,
0x20, 0x19, 0x26, 0x6c, 0x20, 0x19, 0x5c, 0x6c,
0x00, 0xe2, 0x4e, 0x5c, 0x00, 0xe2, 0x84, 0x5c,
0x04, 0x19, 0x40, 0x6c, 0x04, 0x19, 0x76, 0x6c,
0x02, 0x19, 0x32, 0x00, 0x02, 0x19, 0x32, 0x00,
0x01, 0x84, 0x41, 0x7c, 0x01, 0x84, 0x77, 0x7c,
0x01, 0x1b, 0x3a, 0x7c, 0x01, 0x1b, 0x70, 0x7c,
0x01, 0x1a, 0x40, 0x6c, 0x01, 0x1a, 0x76, 0x6c,
0x00, 0xe2, 0xf0, 0x43, 0x00, 0xe2, 0x26, 0x44,
0x80, 0x4b, 0x46, 0x6c, 0x80, 0x4b, 0x7c, 0x6c,
0x01, 0x4c, 0x42, 0x7c, 0x01, 0x4c, 0x78, 0x7c,
0x03, 0x42, 0xf0, 0x6b, 0x03, 0x42, 0x26, 0x6c,
0x00, 0xe2, 0x78, 0x5b, 0x00, 0xe2, 0xae, 0x5b,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0x04, 0x33, 0xa7, 0x79, 0x04, 0x33, 0xdd, 0x79,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x02, 0x1b, 0x56, 0x7c, 0x02, 0x1b, 0x8c, 0x7c,
0x08, 0x5d, 0x54, 0x7c, 0x08, 0x5d, 0x8a, 0x7c,
0x03, 0x68, 0x00, 0x37, 0x03, 0x68, 0x00, 0x37,
0x01, 0x84, 0x09, 0x07, 0x01, 0x84, 0x09, 0x07,
0x08, 0x5d, 0x60, 0x6c, 0x08, 0x5d, 0x96, 0x6c,
0x00, 0xe2, 0x5c, 0x58, 0x00, 0xe2, 0x5c, 0x58,
0x00, 0x30, 0xfb, 0x58, 0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30, 0x01, 0x30, 0x01, 0x30,
0x00, 0xe2, 0x4e, 0x44, 0x00, 0xe2, 0x84, 0x44,
0x80, 0x1b, 0x6a, 0x7c, 0x80, 0x1b, 0xa0, 0x7c,
0x80, 0x84, 0x6b, 0x6c, 0x80, 0x84, 0xa1, 0x6c,
0xff, 0x85, 0x0b, 0x1b, 0xff, 0x85, 0x0b, 0x1b,
0xff, 0x86, 0x0d, 0x23, 0xff, 0x86, 0x0d, 0x23,
0xff, 0x87, 0x0f, 0x23, 0xff, 0x87, 0x0f, 0x23,
0xf8, 0x1b, 0x08, 0x0b, 0xf8, 0x1b, 0x08, 0x0b,
0xff, 0xea, 0x4e, 0x09, 0xff, 0xea, 0x4e, 0x09,
0x04, 0x1b, 0x72, 0x7c, 0x04, 0x1b, 0xa8, 0x7c,
0x01, 0xa7, 0x4e, 0x01, 0x01, 0xa7, 0x4e, 0x01,
0xff, 0xea, 0x06, 0x0b, 0xff, 0xea, 0x06, 0x0b,
0x03, 0x68, 0x00, 0x37, 0x03, 0x68, 0x00, 0x37,
0x00, 0xe2, 0xac, 0x58,
0x10, 0xea, 0x18, 0x00,
0xf9, 0xd9, 0xb2, 0x0d,
0x01, 0xd9, 0xb2, 0x05,
0xff, 0xea, 0xd4, 0x09, 0xff, 0xea, 0xd4, 0x09,
0x20, 0x5b, 0x84, 0x6c, 0x10, 0x5b, 0xcc, 0x6c,
0x10, 0x5b, 0x8e, 0x6c, 0x08, 0x5b, 0xd4, 0x6c,
0x08, 0x5b, 0x96, 0x6c, 0x20, 0x5b, 0xc2, 0x6c,
0x02, 0x5b, 0xa4, 0x6d, 0x02, 0x5b, 0xe2, 0x6d,
0x0e, 0xea, 0x06, 0x59, 0x0e, 0xea, 0x3c, 0x59,
0x0e, 0xea, 0x04, 0x00, 0x0e, 0xea, 0x04, 0x00,
0x08, 0x19, 0x8a, 0x7c, 0x08, 0x19, 0xc8, 0x7c,
0xdf, 0x5c, 0xb8, 0x08, 0xdf, 0x5c, 0xb8, 0x08,
0x01, 0xd9, 0xb2, 0x05, 0x01, 0xd9, 0xb2, 0x05,
0x02, 0xea, 0xb4, 0x00, 0x02, 0xea, 0xb4, 0x00,
0x01, 0xd9, 0xb2, 0x05, 0x01, 0xd9, 0xb2, 0x05,
0x01, 0xa4, 0x6d, 0x6d, 0x01, 0xa4, 0xab, 0x6d,
0x00, 0xe2, 0xce, 0x5b, 0x00, 0xe2, 0x04, 0x5c,
0x00, 0xe2, 0xb0, 0x5c, 0x00, 0xe2, 0xee, 0x5c,
0x01, 0xd9, 0xb2, 0x05, 0x01, 0xd9, 0xb2, 0x05,
0x00, 0xe2, 0xdc, 0x5a, 0x00, 0xe2, 0x12, 0x5b,
0xf3, 0x92, 0xd5, 0x19, 0xf3, 0x92, 0xd5, 0x19,
0x00, 0xe2, 0xa4, 0x54, 0x00, 0xe2, 0xe2, 0x54,
0x80, 0x92, 0xa5, 0x6c, 0x80, 0x92, 0xe3, 0x6c,
0x0f, 0xea, 0x06, 0x59, 0x0f, 0xea, 0x3c, 0x59,
0x0f, 0xea, 0x04, 0x00, 0x0f, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xac, 0x44, 0x00, 0xe2, 0xea, 0x44,
0x04, 0x8c, 0xe1, 0x30, 0x04, 0x8c, 0xe1, 0x30,
0x01, 0xea, 0xf2, 0x00, 0x01, 0xea, 0xf2, 0x00,
0x02, 0xea, 0x36, 0x00, 0x02, 0xea, 0x36, 0x00,
0xa8, 0xea, 0x32, 0x00, 0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0x32, 0x5d, 0x00, 0xe2, 0x70, 0x5d,
0x01, 0xd9, 0xb2, 0x05, 0x01, 0xd9, 0xb2, 0x05,
0x02, 0xa8, 0xf4, 0x31, 0x02, 0xa8, 0xf4, 0x31,
0x02, 0xa6, 0xc2, 0x7c, 0x02, 0xa6, 0x00, 0x7d,
0x00, 0xe2, 0xf4, 0x58, 0x00, 0xe2, 0x2a, 0x59,
0x20, 0x5b, 0xd0, 0x6c, 0x20, 0x5b, 0x0e, 0x6d,
0xfc, 0x42, 0xbc, 0x7c, 0xfc, 0x42, 0xfa, 0x7c,
0x10, 0x40, 0xbe, 0x6c, 0x10, 0x40, 0xfc, 0x6c,
0x20, 0x4d, 0xc0, 0x7c, 0x20, 0x4d, 0xfe, 0x7c,
0x08, 0x5d, 0xd0, 0x6c, 0x08, 0x5d, 0x0e, 0x6d,
0x02, 0xa6, 0x7e, 0x6b, 0x02, 0xa6, 0xb4, 0x6b,
0x00, 0xe2, 0xf4, 0x58, 0x00, 0xe2, 0x2a, 0x59,
0x20, 0x5b, 0xd0, 0x6c, 0x20, 0x5b, 0x0e, 0x6d,
0x01, 0x1b, 0xf0, 0x6c, 0x01, 0x1b, 0x2e, 0x6d,
0xfc, 0x42, 0xcc, 0x7c, 0xfc, 0x42, 0x0a, 0x7d,
0x10, 0x40, 0xce, 0x6c, 0x10, 0x40, 0x0c, 0x6d,
0x20, 0x4d, 0x10, 0x7d, 0x20, 0x4d, 0x4e, 0x7d,
0x08, 0x5d, 0x10, 0x7d, 0x08, 0x5d, 0x4e, 0x7d,
0x02, 0x19, 0x32, 0x00, 0x02, 0x19, 0x32, 0x00,
0x01, 0x5b, 0x40, 0x31, 0x01, 0x5b, 0x40, 0x31,
0x00, 0xe2, 0x4e, 0x5c, 0x00, 0xe2, 0x84, 0x5c,
0x00, 0xe2, 0x42, 0x5b,
0x20, 0xea, 0xb6, 0x00,
0x00, 0xe2, 0x78, 0x5b, 0x00, 0xe2, 0x78, 0x5b,
0x20, 0xea, 0xb6, 0x00,
0x00, 0xe2, 0xae, 0x5b,
0x20, 0x5c, 0xb8, 0x00, 0x20, 0x5c, 0xb8, 0x00,
0x04, 0x19, 0xe6, 0x6c, 0x04, 0x19, 0x24, 0x6d,
0x01, 0x1a, 0xe6, 0x6c, 0x01, 0x1a, 0x24, 0x6d,
0x00, 0xe2, 0xf4, 0x58, 0x00, 0xe2, 0x2a, 0x59,
0x01, 0x1a, 0x10, 0x7d, 0x01, 0x1a, 0x4e, 0x7d,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0x20, 0xa0, 0x56, 0x7d, 0x20, 0xa0, 0x94, 0x7d,
0x08, 0xa8, 0xef, 0x7c, 0x08, 0xa8, 0x2d, 0x7d,
0x00, 0xe2, 0x02, 0x45, 0x00, 0xe2, 0x40, 0x45,
0x02, 0xea, 0xb4, 0x04, 0x02, 0xea, 0xb4, 0x04,
0x02, 0x19, 0x32, 0x00, 0x02, 0x19, 0x32, 0x00,
0x08, 0xa8, 0x13, 0x7d, 0x08, 0xa8, 0x51, 0x7d,
0x04, 0x5d, 0x6c, 0x7d, 0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0x6c, 0x7d, 0x01, 0x1a, 0xaa, 0x7d,
0x01, 0xa4, 0x49, 0x03, 0x01, 0xa4, 0x49, 0x03,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0x02, 0xa8, 0x84, 0x32, 0x02, 0xa8, 0x84, 0x32,
0x02, 0xea, 0xb4, 0x00, 0x02, 0xea, 0xb4, 0x00,
0x00, 0xe2, 0xec, 0x42, 0x00, 0xe2, 0x22, 0x43,
0x02, 0xa8, 0x84, 0x32, 0x02, 0xa8, 0x84, 0x32,
0x02, 0xea, 0xb4, 0x00, 0x02, 0xea, 0xb4, 0x00,
0xff, 0xea, 0xd4, 0x19, 0xff, 0xea, 0xd4, 0x19,
0x00, 0xe2, 0x00, 0x59, 0x00, 0xe2, 0x36, 0x59,
0x11, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x10,
0x00, 0xe2, 0x42, 0x5d, 0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0xec, 0x52, 0x00, 0xe2, 0x22, 0x53,
0xff, 0xea, 0xd4, 0x0d, 0xff, 0xea, 0xd4, 0x0d,
0x00, 0xe2, 0xf4, 0x58, 0x00, 0xe2, 0x2a, 0x59,
0x40, 0x5b, 0x1e, 0x6d, 0x40, 0x5b, 0x5c, 0x6d,
0x04, 0x5d, 0x6c, 0x7d, 0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0x6c, 0x7d, 0x01, 0x1a, 0xaa, 0x7d,
0x20, 0x4d, 0x10, 0x7d, 0x20, 0x4d, 0x4e, 0x7d,
0x40, 0x5b, 0x56, 0x7d, 0x40, 0x5b, 0x94, 0x7d,
0x04, 0x5d, 0x6c, 0x7d, 0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0x6c, 0x7d, 0x01, 0x1a, 0xaa, 0x7d,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0x01, 0xa4, 0x49, 0x03, 0x01, 0xa4, 0x49, 0x03,
0x08, 0xa8, 0x03, 0x6d, 0x08, 0xa8, 0x41, 0x6d,
0x02, 0xea, 0xb4, 0x04, 0x02, 0xea, 0xb4, 0x04,
0xff, 0x6a, 0x38, 0x7d, 0xff, 0x6a, 0x76, 0x7d,
0x10, 0xea, 0x06, 0x59, 0x10, 0xea, 0x3c, 0x59,
0x10, 0xea, 0x04, 0x00, 0x10, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x38, 0x45, 0x00, 0xe2, 0x76, 0x45,
0x00, 0xe2, 0xf2, 0x58, 0x00, 0xe2, 0x28, 0x59,
0x10, 0x5d, 0x2a, 0x6d, 0x10, 0x5d, 0x68, 0x6d,
0x40, 0x5b, 0x10, 0x7d, 0x40, 0x5b, 0x4e, 0x7d,
0x02, 0x19, 0x32, 0x00, 0x02, 0x19, 0x32, 0x00,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0xff, 0xea, 0x10, 0x03, 0xff, 0xea, 0x10, 0x03,
0x08, 0xa8, 0x51, 0x03, 0x08, 0xa8, 0x51, 0x03,
0x00, 0xe2, 0x02, 0x45, 0x00, 0xe2, 0x40, 0x45,
0x80, 0xf9, 0x10, 0x6d, 0x80, 0xf9, 0x4e, 0x6d,
0x01, 0x43, 0xc1, 0x31, 0x01, 0x43, 0xc1, 0x31,
0x00, 0xfb, 0x10, 0x65, 0x00, 0xfb, 0x4e, 0x65,
0x01, 0x42, 0xc1, 0x31, 0x01, 0x42, 0xc1, 0x31,
0x00, 0xfa, 0x10, 0x65, 0x00, 0xfa, 0x4e, 0x65,
0x01, 0xe8, 0xd4, 0x1d, 0x01, 0xe8, 0xd4, 0x1d,
0x30, 0x3f, 0xc0, 0x09, 0x30, 0x3f, 0xc0, 0x09,
0x30, 0xe0, 0x10, 0x65, 0x30, 0xe0, 0x4e, 0x65,
0x40, 0x4b, 0x10, 0x6d, 0x40, 0x4b, 0x4e, 0x6d,
0xff, 0xea, 0x52, 0x01, 0xff, 0xea, 0x52, 0x01,
0xee, 0x00, 0x5c, 0x6d, 0xee, 0x00, 0x9a, 0x6d,
0x80, 0xf9, 0xf2, 0x01, 0x80, 0xf9, 0xf2, 0x01,
0x02, 0xea, 0xb4, 0x00, 0x02, 0xea, 0xb4, 0x00,
0x20, 0xea, 0x9a, 0x00, 0x20, 0xea, 0x9a, 0x00,
0xf3, 0x42, 0x66, 0x6d, 0xf3, 0x42, 0xa4, 0x6d,
0x12, 0xea, 0x06, 0x59, 0x12, 0xea, 0x3c, 0x59,
0x12, 0xea, 0x04, 0x00, 0x12, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x0d, 0xea, 0x06, 0x59, 0x0d, 0xea, 0x3c, 0x59,
0x0d, 0xea, 0x04, 0x00, 0x0d, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41, 0x00, 0xe2, 0xdc, 0x41,
0x11, 0xea, 0x06, 0x59, 0x11, 0xea, 0x3c, 0x59,
0x11, 0xea, 0x04, 0x00, 0x11, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xdc, 0x5a, 0x00, 0xe2, 0x12, 0x5b,
0x08, 0x5a, 0xb4, 0x00, 0x08, 0x5a, 0xb4, 0x00,
0x00, 0xe2, 0x8e, 0x5d, 0x00, 0xe2, 0xcc, 0x5d,
0xa8, 0xea, 0x32, 0x00, 0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0xf4, 0x58, 0x00, 0xe2, 0x2a, 0x59,
0x80, 0x1a, 0x80, 0x7d, 0x80, 0x1a, 0xbe, 0x7d,
0x00, 0xe2, 0x8e, 0x5d, 0x00, 0xe2, 0xcc, 0x5d,
0x80, 0x19, 0x32, 0x00, 0x80, 0x19, 0x32, 0x00,
0x40, 0x5b, 0x86, 0x6d, 0x40, 0x5b, 0xc4, 0x6d,
0x08, 0x5a, 0x86, 0x7d, 0x08, 0x5a, 0xc4, 0x7d,
0x20, 0x4d, 0x10, 0x7d, 0x20, 0x4d, 0x4e, 0x7d,
0x02, 0x84, 0x09, 0x03, 0x02, 0x84, 0x09, 0x03,
0x40, 0x5b, 0x56, 0x7d, 0x40, 0x5b, 0x94, 0x7d,
0x08, 0xa8, 0xfb, 0x6c, 0x08, 0xa8, 0x39, 0x6d,
0x02, 0xea, 0xb4, 0x04, 0x02, 0xea, 0xb4, 0x04,
0x01, 0x38, 0xe1, 0x30, 0x01, 0x38, 0xe1, 0x30,
0x05, 0x39, 0xe3, 0x98, 0x05, 0x39, 0xe3, 0x98,
...@@ -727,7 +758,7 @@ static uint8_t seqprog[] = { ...@@ -727,7 +758,7 @@ static uint8_t seqprog[] = {
0x04, 0xea, 0xe8, 0x30, 0x04, 0xea, 0xe8, 0x30,
0xff, 0xea, 0xf0, 0x08, 0xff, 0xea, 0xf0, 0x08,
0x02, 0xea, 0xf2, 0x00, 0x02, 0xea, 0xf2, 0x00,
0xff, 0xea, 0xf4, 0x08 0xff, 0xea, 0xf4, 0x0c
}; };
typedef int ahd_patch_func_t (struct ahd_softc *ahd); typedef int ahd_patch_func_t (struct ahd_softc *ahd);
...@@ -911,102 +942,104 @@ static struct patch { ...@@ -911,102 +942,104 @@ static struct patch {
{ ahd_patch0_func, 51, 1, 1 }, { ahd_patch0_func, 51, 1, 1 },
{ ahd_patch2_func, 54, 1, 2 }, { ahd_patch2_func, 54, 1, 2 },
{ ahd_patch0_func, 55, 1, 1 }, { ahd_patch0_func, 55, 1, 1 },
{ ahd_patch2_func, 125, 6, 1 }, { ahd_patch2_func, 152, 6, 1 },
{ ahd_patch1_func, 131, 2, 1 }, { ahd_patch1_func, 158, 2, 1 },
{ ahd_patch3_func, 133, 1, 1 }, { ahd_patch3_func, 160, 1, 1 },
{ ahd_patch2_func, 142, 1, 2 }, { ahd_patch2_func, 169, 1, 2 },
{ ahd_patch0_func, 143, 1, 1 }, { ahd_patch0_func, 170, 1, 1 },
{ ahd_patch4_func, 144, 2, 2 }, { ahd_patch4_func, 171, 2, 2 },
{ ahd_patch0_func, 146, 6, 3 }, { ahd_patch0_func, 173, 6, 3 },
{ ahd_patch2_func, 149, 1, 2 }, { ahd_patch2_func, 176, 1, 2 },
{ ahd_patch0_func, 150, 1, 1 }, { ahd_patch0_func, 177, 1, 1 },
{ ahd_patch2_func, 153, 1, 2 }, { ahd_patch2_func, 180, 1, 2 },
{ ahd_patch0_func, 154, 1, 1 }, { ahd_patch0_func, 181, 1, 1 },
{ ahd_patch5_func, 156, 2, 1 }, { ahd_patch5_func, 183, 2, 1 },
{ ahd_patch3_func, 164, 16, 2 }, { ahd_patch3_func, 191, 16, 2 },
{ ahd_patch0_func, 180, 1, 1 }, { ahd_patch0_func, 207, 1, 1 },
{ ahd_patch6_func, 200, 2, 1 }, { ahd_patch6_func, 227, 2, 1 },
{ ahd_patch5_func, 204, 2, 1 }, { ahd_patch5_func, 231, 2, 1 },
{ ahd_patch1_func, 218, 1, 2 }, { ahd_patch1_func, 245, 1, 2 },
{ ahd_patch0_func, 219, 1, 1 }, { ahd_patch0_func, 246, 1, 1 },
{ ahd_patch1_func, 222, 1, 2 }, { ahd_patch1_func, 249, 1, 2 },
{ ahd_patch0_func, 223, 1, 1 }, { ahd_patch0_func, 250, 1, 1 },
{ ahd_patch2_func, 226, 1, 2 }, { ahd_patch2_func, 253, 1, 2 },
{ ahd_patch0_func, 227, 1, 1 }, { ahd_patch0_func, 254, 1, 1 },
{ ahd_patch1_func, 282, 1, 2 }, { ahd_patch1_func, 309, 1, 2 },
{ ahd_patch0_func, 283, 1, 1 }, { ahd_patch0_func, 310, 1, 1 },
{ ahd_patch2_func, 291, 1, 2 }, { ahd_patch2_func, 318, 1, 2 },
{ ahd_patch0_func, 292, 1, 1 }, { ahd_patch0_func, 319, 1, 1 },
{ ahd_patch2_func, 295, 1, 2 }, { ahd_patch2_func, 322, 1, 2 },
{ ahd_patch0_func, 296, 1, 1 }, { ahd_patch0_func, 323, 1, 1 },
{ ahd_patch1_func, 303, 1, 2 }, { ahd_patch1_func, 330, 1, 2 },
{ ahd_patch0_func, 304, 1, 1 }, { ahd_patch0_func, 331, 1, 1 },
{ ahd_patch7_func, 323, 1, 1 }, { ahd_patch7_func, 350, 1, 1 },
{ ahd_patch7_func, 326, 1, 1 }, { ahd_patch7_func, 353, 1, 1 },
{ ahd_patch7_func, 328, 1, 1 }, { ahd_patch7_func, 355, 1, 1 },
{ ahd_patch7_func, 340, 1, 1 }, { ahd_patch7_func, 367, 1, 1 },
{ ahd_patch1_func, 350, 1, 2 }, { ahd_patch1_func, 377, 1, 2 },
{ ahd_patch0_func, 351, 1, 1 }, { ahd_patch0_func, 378, 1, 1 },
{ ahd_patch1_func, 353, 1, 2 }, { ahd_patch1_func, 380, 1, 2 },
{ ahd_patch0_func, 354, 1, 1 }, { ahd_patch0_func, 381, 1, 1 },
{ ahd_patch1_func, 362, 1, 2 }, { ahd_patch1_func, 389, 1, 2 },
{ ahd_patch0_func, 363, 1, 1 }, { ahd_patch0_func, 390, 1, 1 },
{ ahd_patch2_func, 374, 1, 2 }, { ahd_patch2_func, 401, 1, 2 },
{ ahd_patch0_func, 375, 1, 1 }, { ahd_patch0_func, 402, 1, 1 },
{ ahd_patch8_func, 377, 1, 1 }, { ahd_patch8_func, 404, 1, 1 },
{ ahd_patch9_func, 404, 1, 1 }, { ahd_patch9_func, 431, 1, 1 },
{ ahd_patch1_func, 411, 1, 2 }, { ahd_patch1_func, 438, 1, 2 },
{ ahd_patch0_func, 412, 1, 1 }, { ahd_patch0_func, 439, 1, 1 },
{ ahd_patch2_func, 424, 1, 2 }, { ahd_patch2_func, 451, 1, 2 },
{ ahd_patch0_func, 425, 1, 1 }, { ahd_patch0_func, 452, 1, 1 },
{ ahd_patch10_func, 453, 1, 1 }, { ahd_patch10_func, 480, 1, 1 },
{ ahd_patch11_func, 462, 1, 2 }, { ahd_patch11_func, 489, 1, 2 },
{ ahd_patch0_func, 463, 1, 1 }, { ahd_patch0_func, 490, 1, 1 },
{ ahd_patch12_func, 468, 1, 1 }, { ahd_patch12_func, 495, 1, 1 },
{ ahd_patch11_func, 469, 1, 1 }, { ahd_patch11_func, 496, 1, 1 },
{ ahd_patch13_func, 482, 1, 2 }, { ahd_patch13_func, 509, 1, 2 },
{ ahd_patch0_func, 483, 1, 1 },
{ ahd_patch1_func, 505, 1, 2 },
{ ahd_patch0_func, 506, 1, 1 },
{ ahd_patch1_func, 509, 1, 2 },
{ ahd_patch0_func, 510, 1, 1 }, { ahd_patch0_func, 510, 1, 1 },
{ ahd_patch2_func, 515, 1, 2 }, { ahd_patch1_func, 532, 1, 2 },
{ ahd_patch0_func, 516, 1, 1 }, { ahd_patch0_func, 533, 1, 1 },
{ ahd_patch2_func, 520, 1, 2 }, { ahd_patch1_func, 536, 1, 2 },
{ ahd_patch0_func, 521, 1, 1 }, { ahd_patch0_func, 537, 1, 1 },
{ ahd_patch1_func, 522, 1, 2 }, { ahd_patch2_func, 542, 1, 2 },
{ ahd_patch0_func, 523, 1, 1 }, { ahd_patch0_func, 543, 1, 1 },
{ ahd_patch2_func, 534, 1, 2 }, { ahd_patch2_func, 547, 1, 2 },
{ ahd_patch0_func, 535, 1, 1 }, { ahd_patch0_func, 548, 1, 1 },
{ ahd_patch14_func, 539, 1, 1 }, { ahd_patch1_func, 549, 1, 2 },
{ ahd_patch15_func, 544, 1, 1 },
{ ahd_patch16_func, 545, 2, 1 },
{ ahd_patch15_func, 549, 1, 2 },
{ ahd_patch0_func, 550, 1, 1 }, { ahd_patch0_func, 550, 1, 1 },
{ ahd_patch2_func, 557, 1, 2 }, { ahd_patch2_func, 561, 1, 2 },
{ ahd_patch0_func, 558, 1, 1 }, { ahd_patch0_func, 562, 1, 1 },
{ ahd_patch1_func, 576, 1, 2 }, { ahd_patch14_func, 566, 1, 1 },
{ ahd_patch15_func, 571, 1, 1 },
{ ahd_patch16_func, 572, 2, 1 },
{ ahd_patch15_func, 576, 1, 2 },
{ ahd_patch0_func, 577, 1, 1 }, { ahd_patch0_func, 577, 1, 1 },
{ ahd_patch1_func, 591, 1, 2 }, { ahd_patch2_func, 584, 1, 2 },
{ ahd_patch0_func, 592, 1, 1 }, { ahd_patch0_func, 585, 1, 1 },
{ ahd_patch14_func, 616, 1, 1 }, { ahd_patch2_func, 600, 1, 2 },
{ ahd_patch14_func, 632, 1, 1 }, { ahd_patch0_func, 601, 1, 1 },
{ ahd_patch2_func, 644, 1, 2 }, { ahd_patch1_func, 607, 1, 2 },
{ ahd_patch0_func, 645, 1, 1 }, { ahd_patch0_func, 608, 1, 1 },
{ ahd_patch1_func, 662, 1, 2 }, { ahd_patch1_func, 622, 1, 2 },
{ ahd_patch0_func, 663, 1, 1 }, { ahd_patch0_func, 623, 1, 1 },
{ ahd_patch14_func, 668, 1, 1 }, { ahd_patch14_func, 647, 1, 1 },
{ ahd_patch1_func, 688, 1, 2 }, { ahd_patch14_func, 663, 1, 1 },
{ ahd_patch0_func, 689, 1, 1 }, { ahd_patch2_func, 675, 1, 2 },
{ ahd_patch1_func, 691, 1, 2 }, { ahd_patch0_func, 676, 1, 1 },
{ ahd_patch0_func, 692, 1, 1 }, { ahd_patch1_func, 693, 1, 2 },
{ ahd_patch1_func, 694, 1, 2 }, { ahd_patch0_func, 694, 1, 1 },
{ ahd_patch0_func, 695, 1, 1 }, { ahd_patch14_func, 699, 1, 1 },
{ ahd_patch17_func, 697, 1, 2 }, { ahd_patch1_func, 719, 1, 2 },
{ ahd_patch0_func, 698, 2, 1 }, { ahd_patch0_func, 720, 1, 1 },
{ ahd_patch18_func, 701, 4, 2 }, { ahd_patch1_func, 722, 1, 2 },
{ ahd_patch0_func, 705, 1, 1 }, { ahd_patch0_func, 723, 1, 1 },
{ ahd_patch18_func, 711, 11, 1 } { ahd_patch1_func, 725, 1, 2 },
{ ahd_patch0_func, 726, 1, 1 },
{ ahd_patch17_func, 728, 1, 2 },
{ ahd_patch0_func, 729, 2, 1 },
{ ahd_patch18_func, 732, 4, 2 },
{ ahd_patch0_func, 736, 1, 1 },
{ ahd_patch18_func, 742, 11, 1 }
}; };
static struct cs { static struct cs {
...@@ -1017,17 +1050,17 @@ static struct cs { ...@@ -1017,17 +1050,17 @@ static struct cs {
{ 13, 14 }, { 13, 14 },
{ 24, 32 }, { 24, 32 },
{ 33, 46 }, { 33, 46 },
{ 56, 59 }, { 59, 62 },
{ 68, 90 }, { 89, 114 },
{ 91, 119 }, { 115, 146 },
{ 121, 125 }, { 148, 152 },
{ 133, 141 }, { 160, 168 },
{ 164, 197 }, { 191, 224 },
{ 616, 632 }, { 647, 663 },
{ 632, 650 }, { 663, 681 },
{ 655, 661 }, { 686, 692 },
{ 668, 673 }, { 699, 704 },
{ 673, 679 } { 704, 710 }
}; };
static const int num_critical_sections = sizeof(critical_sections) static const int num_critical_sections = sizeof(critical_sections)
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#103 $ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#104 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -1848,7 +1848,6 @@ ahc_update_neg_request(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, ...@@ -1848,7 +1848,6 @@ ahc_update_neg_request(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
tinfo->curr.period = AHC_PERIOD_UNKNOWN; tinfo->curr.period = AHC_PERIOD_UNKNOWN;
tinfo->curr.width = AHC_WIDTH_UNKNOWN; tinfo->curr.width = AHC_WIDTH_UNKNOWN;
tinfo->curr.offset = AHC_OFFSET_UNKNOWN; tinfo->curr.offset = AHC_OFFSET_UNKNOWN;
tinfo->curr.ppr_options = AHC_OFFSET_UNKNOWN;
} }
if (tinfo->curr.period != tinfo->goal.period if (tinfo->curr.period != tinfo->goal.period
|| tinfo->curr.width != tinfo->goal.width || tinfo->curr.width != tinfo->goal.width
......
/* /*
* Adaptec AIC7xxx device driver for Linux. * Adaptec AIC7xxx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#161 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#163 $
* *
* Copyright (c) 1994 John Aycock * Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science. * The University of Calgary Department of Computer Science.
...@@ -812,9 +812,10 @@ static int ahc_linux_release(struct Scsi_Host *); ...@@ -812,9 +812,10 @@ static int ahc_linux_release(struct Scsi_Host *);
static int ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); static int ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
static const char *ahc_linux_info(struct Scsi_Host *); static const char *ahc_linux_info(struct Scsi_Host *);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
static int ahc_linux_slave_alloc(Scsi_Device *);
static int ahc_linux_slave_configure(Scsi_Device *); static int ahc_linux_slave_configure(Scsi_Device *);
static void ahc_linux_slave_destroy(Scsi_Device *); static void ahc_linux_slave_destroy(Scsi_Device *);
static int ahd_linux_biosparam(struct scsi_device*, static int ahc_linux_biosparam(struct scsi_device*,
struct block_device*, struct block_device*,
sector_t, int[]); sector_t, int[]);
#else #else
...@@ -874,15 +875,6 @@ ahc_linux_detect(Scsi_Host_Template *template) ...@@ -874,15 +875,6 @@ ahc_linux_detect(Scsi_Host_Template *template)
template->proc_dir = &proc_scsi_aic7xxx; template->proc_dir = &proc_scsi_aic7xxx;
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
/*
* We can only map 16MB per-SG
* so create a sector limit of
* "16MB" in 2K sectors.
*/
template->max_sectors = 8192;
#endif
/* /*
* Initialize our softc list lock prior to * Initialize our softc list lock prior to
* probing for any adapters. * probing for any adapters.
...@@ -1029,9 +1021,11 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *)) ...@@ -1029,9 +1021,11 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
static int static int
ahc_linux_slave_alloc(Scsi_Device *device) ahc_linux_slave_alloc(Scsi_Device *device)
{ {
/* struct ahc_softc *ahc;
* Nothing to be done for now.
*/ ahc = *((struct ahc_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Alloc %d\n", ahc_name(ahc), device->id);
return (0); return (0);
} }
...@@ -1043,6 +1037,8 @@ ahc_linux_slave_configure(Scsi_Device *device) ...@@ -1043,6 +1037,8 @@ ahc_linux_slave_configure(Scsi_Device *device)
u_long flags; u_long flags;
ahc = *((struct ahc_softc **)device->host->hostdata); ahc = *((struct ahc_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Configure %d\n", ahc_name(ahc), device->id);
ahc_midlayer_entrypoint_lock(ahc, &flags); ahc_midlayer_entrypoint_lock(ahc, &flags);
/* /*
* Since Linux has attached to the device, configure * Since Linux has attached to the device, configure
...@@ -1055,8 +1051,8 @@ ahc_linux_slave_configure(Scsi_Device *device) ...@@ -1055,8 +1051,8 @@ ahc_linux_slave_configure(Scsi_Device *device)
if (dev != NULL) { if (dev != NULL) {
dev->flags &= ~AHC_DEV_UNCONFIGURED; dev->flags &= ~AHC_DEV_UNCONFIGURED;
dev->scsi_device = device; dev->scsi_device = device;
}
ahc_linux_device_queue_depth(ahc, dev); ahc_linux_device_queue_depth(ahc, dev);
}
ahc_midlayer_entrypoint_unlock(ahc, &flags); ahc_midlayer_entrypoint_unlock(ahc, &flags);
return (0); return (0);
} }
...@@ -1069,12 +1065,26 @@ ahc_linux_slave_destroy(Scsi_Device *device) ...@@ -1069,12 +1065,26 @@ ahc_linux_slave_destroy(Scsi_Device *device)
u_long flags; u_long flags;
ahc = *((struct ahc_softc **)device->host->hostdata); ahc = *((struct ahc_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Destroy %d\n", ahc_name(ahc), device->id);
ahc_midlayer_entrypoint_lock(ahc, &flags); ahc_midlayer_entrypoint_lock(ahc, &flags);
dev = ahc_linux_get_device(ahc, device->channel, dev = ahc_linux_get_device(ahc, device->channel,
device->id, device->lun, device->id, device->lun,
/*alloc*/FALSE); /*alloc*/FALSE);
if (dev != NULL) /*
* Filter out "silly" deletions of real devices by only
* deleting devices that have had slave_configure()
* called on them. All other devices that have not
* been configured will automatically be deleted by
* the refcounting process.
*/
if (dev != NULL
&& (dev->flags & AHC_DEV_SLAVE_CONFIGURED) != 0) {
dev->flags |= AHC_DEV_UNCONFIGURED; dev->flags |= AHC_DEV_UNCONFIGURED;
if (TAILQ_EMPTY(&dev->busyq)
&& dev->active == 0)
ahc_linux_free_device(ahc, dev);
}
ahc_midlayer_entrypoint_unlock(ahc, &flags); ahc_midlayer_entrypoint_unlock(ahc, &flags);
} }
#else #else
...@@ -1135,10 +1145,15 @@ static int ...@@ -1135,10 +1145,15 @@ static int
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev, ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev,
sector_t capacity, int geom[]) sector_t capacity, int geom[])
{
uint8_t *bh;
#else #else
ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[]) ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
#endif
{ {
struct scsi_device *sdev = disk->device;
u_long capacity = disk->capacity;
struct buffer_head *bh;
#endif
int heads; int heads;
int sectors; int sectors;
int cylinders; int cylinders;
...@@ -1146,23 +1161,9 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[]) ...@@ -1146,23 +1161,9 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
int extended; int extended;
struct ahc_softc *ahc; struct ahc_softc *ahc;
u_int channel; u_int channel;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
uint8_t *bh;
channel = sdev->channel;
#else
u_long capacity;
struct buffer_head *bh;
capacity = disk->capacity;
channel = disk->device->channel;
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
ahc = *((struct ahc_softc **)sdev->host->hostdata); ahc = *((struct ahc_softc **)sdev->host->hostdata);
#else channel = sdev->channel;
ahc = *((struct ahc_softc **)disk->device->host->hostdata);
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
bh = scsi_bios_ptable(bdev); bh = scsi_bios_ptable(bdev);
...@@ -1185,7 +1186,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[]) ...@@ -1185,7 +1186,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
} }
heads = 64; heads = 64;
sectors = 32; sectors = 32;
cylinders = capacity / (heads * sectors); cylinders = aic_sector_div(capacity, heads, sectors);
if (aic7xxx_extended != 0) if (aic7xxx_extended != 0)
extended = 1; extended = 1;
...@@ -1196,7 +1197,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[]) ...@@ -1196,7 +1197,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
if (extended && cylinders >= 1024) { if (extended && cylinders >= 1024) {
heads = 255; heads = 255;
sectors = 63; sectors = 63;
cylinders = capacity / (heads * sectors); cylinders = aic_sector_div(capacity, heads, sectors);
} }
geom[0] = heads; geom[0] = heads;
geom[1] = sectors; geom[1] = sectors;
...@@ -1288,6 +1289,14 @@ Scsi_Host_Template aic7xxx_driver_template = { ...@@ -1288,6 +1289,14 @@ Scsi_Host_Template aic7xxx_driver_template = {
.sg_tablesize = AHC_NSEG, .sg_tablesize = AHC_NSEG,
.cmd_per_lun = 2, .cmd_per_lun = 2,
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
/*
* We can only map 16MB per-SG
* so create a sector limit of
* "16MB" in 2K sectors.
*/
.max_sectors = 8192,
#endif
#if defined CONFIG_HIGHIO #if defined CONFIG_HIGHIO
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
/* Assume RedHat Distribution with its different HIGHIO conventions. */ /* Assume RedHat Distribution with its different HIGHIO conventions. */
...@@ -1298,6 +1307,8 @@ Scsi_Host_Template aic7xxx_driver_template = { ...@@ -1298,6 +1307,8 @@ Scsi_Host_Template aic7xxx_driver_template = {
#endif #endif
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
.name = "aic7xxx",
.slave_alloc = ahc_linux_slave_alloc,
.slave_configure = ahc_linux_slave_configure, .slave_configure = ahc_linux_slave_configure,
.slave_destroy = ahc_linux_slave_destroy, .slave_destroy = ahc_linux_slave_destroy,
#else #else
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#109 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#111 $
* *
*/ */
#ifndef _AIC7XXX_LINUX_H_ #ifndef _AIC7XXX_LINUX_H_
...@@ -300,7 +300,7 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec) ...@@ -300,7 +300,7 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec)
#include <linux/smp.h> #include <linux/smp.h>
#endif #endif
#define AIC7XXX_DRIVER_VERSION "6.2.23" #define AIC7XXX_DRIVER_VERSION "6.2.24"
/**************************** Front End Queues ********************************/ /**************************** Front End Queues ********************************/
/* /*
...@@ -347,7 +347,8 @@ typedef enum { ...@@ -347,7 +347,8 @@ typedef enum {
AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */ AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */ AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
AHC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */ AHC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
AHC_DEV_PERIODIC_OTAG = 0x40 /* Send OTAG to prevent starvation */ AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
AHC_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
} ahc_linux_dev_flags; } ahc_linux_dev_flags;
struct ahc_linux_target; struct ahc_linux_target;
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#27 $ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#28 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -707,7 +707,7 @@ expression: ...@@ -707,7 +707,7 @@ expression:
; ;
constant: constant:
T_CONST T_SYMBOL numerical_value T_CONST T_SYMBOL expression
{ {
if ($2->type != UNINITIALIZED) { if ($2->type != UNINITIALIZED) {
stop("Re-definition of symbol as a constant", stop("Re-definition of symbol as a constant",
...@@ -716,7 +716,7 @@ constant: ...@@ -716,7 +716,7 @@ constant:
} }
$2->type = CONST; $2->type = CONST;
initialize_symbol($2); initialize_symbol($2);
$2->info.cinfo->value = $3; $2->info.cinfo->value = $3.value;
} }
| T_CONST T_SYMBOL T_DOWNLOAD | T_CONST T_SYMBOL T_DOWNLOAD
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment