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.
#
# $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
......@@ -53,7 +53,7 @@ aic7xxx_gen = $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_reg.h
ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
aic7xxx_gen += $(obj)/aic7xxx_reg_print.c
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
else
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
ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
aic79xx_gen += $(obj)/aic79xx_reg_print.c
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
else
aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
......
......@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#76 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#78 $
*
* $FreeBSD$
*/
......@@ -356,7 +356,9 @@ typedef enum {
AHD_CURRENT_SENSING = 0x40000,
AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */
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;
/************************* Hardware SCB Definition ***************************/
......@@ -1063,6 +1065,16 @@ struct ahd_softc {
* Timer handles for timer driven callbacks.
*/
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
......@@ -1106,6 +1118,12 @@ struct ahd_softc {
struct target_cmd *targetcmds;
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.
*/
......@@ -1154,6 +1172,22 @@ struct ahd_softc {
/* Selection Timer settings */
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_tagenable;/* Tagged Queuing allowed */
};
......@@ -1240,6 +1274,7 @@ extern const int ahd_num_aic7770_devs;
/*************************** Function Declarations ****************************/
/******************************************************************************/
void ahd_reset_cmds_pending(struct ahd_softc *ahd);
u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
void ahd_busy_tcl(struct ahd_softc *ahd,
u_int tcl, u_int busyid);
......@@ -1273,6 +1308,12 @@ int ahd_default_config(struct ahd_softc *ahd);
int ahd_parse_cfgdata(struct ahd_softc *ahd,
struct seeprom_config *sc);
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);
int ahd_suspend(struct ahd_softc *ahd);
int ahd_resume(struct ahd_softc *ahd);
......@@ -1295,6 +1336,7 @@ int ahd_wait_flexport(struct ahd_softc *ahd);
/*************************** Interrupt Services *******************************/
void ahd_pci_intr(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);
#ifdef AHD_TARGET_MODE
void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused);
......@@ -1418,7 +1460,8 @@ extern uint32_t ahd_debug;
#define AHD_SHOW_QUEUE 0x02000
#define AHD_SHOW_TQIN 0x04000
#define AHD_SHOW_SG 0x08000
#define AHD_DEBUG_SEQUENCER 0x10000
#define AHD_SHOW_INT_COALESSING 0x10000
#define AHD_DEBUG_SEQUENCER 0x20000
#endif
void ahd_print_scb(struct scb *scb);
void ahd_print_devinfo(struct ahd_softc *ahd,
......
......@@ -39,7 +39,7 @@
*
* $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
......@@ -265,16 +265,17 @@ register HESCB_QOFF {
* Host Mailbox
*/
register HS_MAILBOX {
address 0x0B
address 0x00B
access_mode RW
mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
mask ENINT_COALESS 0x40 /* Perform interrupt coalessing */
}
/*
* Sequencer Interupt Status
*/
register SEQINTSTAT {
address 0x0C
address 0x00C
access_mode RO
field SEQ_SWTMRTO 0x10
field SEQ_SEQINT 0x08
......@@ -287,7 +288,7 @@ register SEQINTSTAT {
* Clear SEQ Interrupt
*/
register CLRSEQINTSTAT {
address 0x0C0
address 0x00C
access_mode WO
field CLRSEQ_SWTMRTO 0x10
field CLRSEQ_SEQINT 0x08
......@@ -300,7 +301,7 @@ register CLRSEQINTSTAT {
* Software Timer
*/
register SWTIMER {
address 0x0E0
address 0x00E
access_mode RW
size 2
}
......@@ -3105,21 +3106,6 @@ register RCVRBIASCALC {
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
* Contains the data FIFO address to be restored if the last
......@@ -3141,6 +3127,21 @@ register SKEWCALC {
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
* Number of FIFO locations that are free.
......@@ -3226,7 +3227,8 @@ register SEQINTCTL {
field INT1_CONTEXT 0x20
field SCS_SEQ_INT1M1 0x10
field SCS_SEQ_INT1M0 0x08
field INTMASK 0x06
field INTMASK2 0x04
field INTMASK1 0x02
field IRET 0x01
}
......@@ -3686,6 +3688,53 @@ scratch_ram {
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
* in non-packetized operation.
......@@ -3860,6 +3909,13 @@ const SCB_TRANSFER_SIZE_1BYTE_LUN 48
/* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */
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
*/
......
......@@ -40,7 +40,7 @@
* $FreeBSD$
*/
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $"
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $"
PATCH_ARG_LIST = "struct ahd_softc *ahd"
PREFIX = "ahd_"
......@@ -164,6 +164,10 @@ idle_loop_next_fifo:
idle_loop_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;
test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
......@@ -181,19 +185,65 @@ scbdma_tohost_done:
and CCSCBCTL, ~(CCARREN|CCSCBEN) ret;
fill_qoutfifo_dmadone:
and CCSCBCTL, ~(CCARREN|CCSCBEN);
mvi INTSTAT, CMDCMPLT;
call qoutfifo_updated;
mvi COMPLETE_SCB_DMAINPROG_HEAD[1], SCB_LIST_NULL;
bmov QOUTFIFO_NEXT_ADDR, SCBHADDR, 4;
test QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
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;
fetch_new_scb_inprog:
test CCSCBCTL, ARRDONE jz return;
fetch_new_scb_done:
and CCSCBCTL, ~(CCARREN|CCSCBEN);
bmov REG0, SCBPTR, 2;
clr A;
add CMDS_PENDING, 1;
adc CMDS_PENDING[1], A;
/* Update the next SCB address to download. */
bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
mvi SCB_NEXT[1], SCB_LIST_NULL;
......@@ -229,7 +279,6 @@ scbdma_idle:
/*
* Give precedence to downloading new SCBs to execute
* unless select-outs are currently frozen.
* XXX Use a timer to prevent completion starvation.
*/
test SEQ_FLAGS2, SELECTOUT_QFROZEN jnz . + 2;
BEGIN_CRITICAL;
......@@ -251,6 +300,9 @@ fill_qoutfifo_loop:
mov CCSCBRAM, SCBPTR;
or CCSCBRAM, A, SCBPTR[1];
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 CCSCBADDR, CCSCBADDR_MAX je fill_qoutfifo_done;
test QOFF_CTLSTA, SDSCB_ROLLOVR jnz fill_qoutfifo_done;
......@@ -949,7 +1001,7 @@ complete_nomsg:
freeze_queue:
/* Cancel any pending select-out. */
test SSTAT0, SELDO jnz . + 2;
test SSTAT0, SELDO|SELINGO jnz . + 2;
and SCSISEQ0, ~ENSELO;
mov ACCUM_SAVE, A;
clr A;
......@@ -1484,11 +1536,28 @@ sgptr_fixup_done:
clr SCB_RESIDUAL_DATACNT[3]; /* We are not the last seg */
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:
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, CFG4ISTAT jnz cfg4istat_intr;
test SEQINTSRC, SAVEPTRS jnz saveptr_intr;
test SEQINTSRC, CFG4ICMD jnz cfg4icmd_intr;
SET_SEQINTCODE(INVALID_SEQINT)
......@@ -1793,7 +1862,7 @@ load_overrun_buf:
/* PKT_OVERRUN_BUFSIZE is a multiple of 256 */
clr HCNT[0];
mvi HCNT[1], ((PKT_OVERRUN_BUFSIZE >> 8) & 0xFF);
clr HCNT[2];
clr HCNT[2] ret;
}
cfg4icmd_intr:
......@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#143 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#147 $
*
* $FreeBSD$
*/
......@@ -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);
static void ahd_reset_current_bus(struct ahd_softc *ahd);
static ahd_callback_t ahd_reset_poll;
static ahd_callback_t ahd_stat_timer;
#ifdef AHD_DUMP_SEQ
static void ahd_dumpseq(struct ahd_softc *ahd);
#endif
......@@ -282,7 +283,6 @@ ahd_set_active_fifo(struct ahd_softc *ahd)
AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
active_fifo = ahd_inb(ahd, DFFSTAT) & CURRFIFO;
/* XXX This is a three possition switch in the B. */
switch (active_fifo) {
case 0:
case 1:
......@@ -332,7 +332,6 @@ ahd_restart(struct ahd_softc *ahd)
ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
ahd_outb(ahd, SCBHCNT, 0);
ahd_outb(ahd, CCSCBCTL, CCSCBRESET);
ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
ahd_unpause(ahd);
}
......@@ -357,12 +356,106 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
}
/************************* 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
ahd_run_qoutfifo(struct ahd_softc *ahd)
{
struct scb *scb;
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);
while ((ahd->qoutfifo[ahd->qoutfifonext]
& QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) {
......@@ -382,8 +475,8 @@ ahd_run_qoutfifo(struct ahd_softc *ahd)
ahd->qoutfifonext = (ahd->qoutfifonext+1) & (AHD_QOUT_SIZE-1);
if (ahd->qoutfifonext == 0)
ahd->qoutfifonext_valid_tag ^= QOUTFIFO_ENTRY_VALID_LE;
}
ahd->flags &= ~AHD_RUNNING_QOUTFIFO;
}
/************************* Interrupt Handling *********************************/
......@@ -1041,7 +1134,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat)
}
ahd_outb(ahd, CLRINT, CLRSCSIINT);
ahd_iocell_first_selection(ahd);
ahd_restart(ahd);
ahd_unpause(ahd);
} else if ((status0 & (SELDI|SELDO)) != 0) {
ahd_iocell_first_selection(ahd);
ahd_unpause(ahd);
......@@ -1699,10 +1792,6 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
ahd_freeze_scb(scb);
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),
SCB_GET_CHANNEL(ahd, scb),
SCB_GET_LUN(scb), SCB_LIST_NULL,
......@@ -2324,7 +2413,6 @@ ahd_update_neg_request(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
tinfo->curr.period = AHD_PERIOD_UNKNOWN;
tinfo->curr.width = AHD_WIDTH_UNKNOWN;
tinfo->curr.offset = AHD_OFFSET_UNKNOWN;
tinfo->curr.ppr_options = AHD_OFFSET_UNKNOWN;
}
if (tinfo->curr.period != tinfo->goal.period
|| tinfo->curr.width != tinfo->goal.width
......@@ -2940,9 +3028,10 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
"does not have a waiting message\n");
printf("SCSIID = %x, target_mask = %x\n", scb->hscb->scsiid,
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,
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)
} else {
/* Single byte message */
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;
index++;
}
......@@ -4093,6 +4184,20 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
SCB_GET_LUN(scb), /*tag*/SCB_LIST_NULL,
ROLE_INITIATOR, CAM_REQUEUE_REQ,
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 {
/*
* Otherwise, we ignore it.
......@@ -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_EXTENDED_TRANS_A|AHD_STPWLEVEL_A;
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) {
ahd_free(ahd);
......@@ -4723,6 +4835,12 @@ ahd_shutdown(void *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 */
ahd_reset(ahd);
}
......@@ -5724,6 +5842,8 @@ ahd_init(struct ahd_softc *ahd)
}
init_done:
ahd_restart(ahd);
ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
ahd_stat_timer, ahd);
return (0);
}
......@@ -5746,6 +5866,12 @@ ahd_chip_init(struct ahd_softc *ahd)
*/
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. */
ahd_outb(ahd, IOWNID, ahd->our_id);
ahd_outb(ahd, TOWNID, ahd->our_id);
......@@ -5850,9 +5976,10 @@ ahd_chip_init(struct ahd_softc *ahd)
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, INTVEC2_ADDR, ahd_resolve_seqaddr(ahd, LABEL_timer_isr));
/*
* Setup SCB Offset registers.
......@@ -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 + 2, (busaddr >> 16) & 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_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
}
......@@ -6268,6 +6406,36 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
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
* outside of all critical sections and that all
......@@ -6278,24 +6446,51 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
void
ahd_pause_and_flushwork(struct ahd_softc *ahd)
{
int intstat;
int maxloops;
u_int intstat;
u_int maxloops;
int paused;
maxloops = 1000;
ahd->flags |= AHD_ALL_INTERRUPTS;
intstat = 0;
paused = FALSE;
do {
struct scb *waiting_scb;
if (paused)
ahd_unpause(ahd);
ahd_intr(ahd);
ahd_pause(ahd);
paused = TRUE;
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)
break;
maxloops--;
} while (((intstat = ahd_inb(ahd, INTSTAT)) & INT_PEND) && --maxloops);
} while (--maxloops
&& (((intstat = ahd_inb(ahd, INTSTAT)) & INT_PEND) != 0
|| (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO))));
if (maxloops == 0) {
printf("Infinite interrupt loop, INTSTAT = %x",
ahd_inb(ahd, INTSTAT));
}
ahd_flush_qoutfifo(ahd);
ahd_platform_flushwork(ahd);
ahd->flags &= ~AHD_ALL_INTERRUPTS;
}
......@@ -6608,13 +6803,38 @@ ahd_qinfifo_count(struct ahd_softc *ahd)
qinpos = ahd_get_snscb_qoff(ahd);
wrap_qinpos = AHD_QIN_WRAP(qinpos);
wrap_qinfifonext = AHD_QIN_WRAP(ahd->qinfifonext);
if (wrap_qinfifonext > wrap_qinpos)
if (wrap_qinfifonext >= wrap_qinpos)
return (wrap_qinfifonext - wrap_qinpos);
else
return (wrap_qinfifonext
+ 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
ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel,
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,
printf(")\n");
}
ahd_set_scbptr(ahd, savedscbptr);
ahd_restore_modes(ahd, saved_modes);
return (found);
}
......@@ -6859,6 +7078,9 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel,
if (found > AHD_SCB_MAX)
panic("SCB LIST LOOP");
}
if (action == SEARCH_COMPLETE
|| action == SEARCH_REMOVE)
ahd_outw(ahd, CMDS_PENDING, ahd_inw(ahd, CMDS_PENDING) - found);
return (found);
}
......@@ -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
* commands for this target that are still active.
......@@ -7037,6 +7265,7 @@ ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel,
ahd_set_scbptr(ahd, active_scb);
ahd_restore_modes(ahd, saved_modes);
ahd_platform_abort_scbs(ahd, target, channel, lun, tag, role, status);
ahd->flags |= AHD_UPDATE_PEND_CMDS;
return found;
}
......@@ -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. */
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->flags & AHD_TARGETROLE) != 0) {
ahd_run_tqinfifo(ahd, /*paused*/TRUE);
......@@ -7266,6 +7489,51 @@ ahd_reset_poll(void *arg)
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 *****************************/
void
......@@ -8121,6 +8389,9 @@ ahd_dump_card_state(struct ahd_softc *ahd)
* Mode independent registers.
*/
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_dffstat_print(ahd_inb(ahd, DFFSTAT), &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)
ahd_seqintctl_print(ahd_inb(ahd, SEQINTCTL), &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_ccscbctl_print(ahd_inb(ahd, CCSCBCTL), &cur_col, 50);
ahd_sstat0_print(ahd_inb(ahd, SSTAT0), &cur_col, 50);
ahd_sstat1_print(ahd_inb(ahd, SSTAT1), &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)
ahd_lqostat1_print(ahd_inb(ahd, LQOSTAT1), &cur_col, 50);
ahd_lqostat2_print(ahd_inb(ahd, LQOSTAT2), &cur_col, 50);
printf("\n");
printf("\nSCB Count = %d LASTSCB 0x%x CURRSCB 0x%x NEXTSCB 0x%x\n",
ahd->scb_data.numscbs, ahd_inw(ahd, LASTSCB),
ahd_inw(ahd, CURRSCB), ahd_inw(ahd, NEXTSCB));
printf("\nSCB Count = %d CMDS_PENDING = %d LASTSCB 0x%x "
"CURRSCB 0x%x NEXTSCB 0x%x\n",
ahd->scb_data.numscbs, ahd_inw(ahd, CMDS_PENDING),
ahd_inw(ahd, LASTSCB), ahd_inw(ahd, CURRSCB),
ahd_inw(ahd, NEXTSCB));
cur_col = 0;
/* QINFIFO */
ahd_search_qinfifo(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
......@@ -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_tag_print(ahd_inb(ahd, SCB_TAG), &cur_col, 60);
}
printf("\n");
printf("\nTotal %d\n", i);
printf("Kernel Free SCB list: ");
i = 0;
......@@ -8249,7 +8521,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
printf("\n");
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),
(ahd_inb(ahd, SHCNT)
......@@ -8287,6 +8559,10 @@ ahd_dump_card_state(struct ahd_softc *ahd)
ahd_inb(ahd, MAXCMDCNT));
ahd_simode0_print(ahd_inb(ahd, SIMODE0), &cur_col, 50);
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);
printf("%s: REG0 == 0x%x, SINDEX = 0x%x, DINDEX = 0x%x\n",
ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX),
......
......@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#39 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#40 $
*
* $FreeBSD$
*/
......@@ -217,8 +217,11 @@ ahd_unpause(struct ahd_softc *ahd)
* prior to the first change of the mode.
*/
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);
}
if ((ahd_inb(ahd, INTSTAT) & ~(SWTMINT | CMDCMPLT)) == 0)
ahd_outb(ahd, HCNTRL, ahd->unpause);
......@@ -913,6 +916,8 @@ ahd_intr(struct ahd_softc *ahd)
ahd_flush_device_writes(ahd);
}
ahd_run_qoutfifo(ahd);
ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++;
ahd->cmdcmplt_total++;
#ifdef AHD_TARGET_MODE
if ((ahd->flags & AHD_TARGETROLE) != 0)
ahd_run_tqinfifo(ahd, /*paused*/FALSE);
......
/*
* 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.
......@@ -88,6 +88,11 @@ struct proc_dir_entry proc_scsi_aic79xx = {
};
#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.
* Note, we honor this only for the initial bus reset.
......@@ -491,7 +496,7 @@ static void ahd_linux_dv_transition(struct ahd_softc *ahd,
struct scsi_cmnd *cmd,
struct ahd_devinfo *devinfo,
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);
static void ahd_linux_dv_fill_cmd(struct ahd_softc *ahd,
struct scsi_cmnd *cmd,
......@@ -520,8 +525,13 @@ static void ahd_linux_dv_su(struct ahd_softc *ahd,
struct scsi_cmnd *cmd,
struct ahd_devinfo *devinfo,
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,
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_generate_dv_pattern(struct ahd_linux_target *targ);
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);
static int ahd_linux_next_unit(void);
static void ahd_runq_tasklet(unsigned long data);
static int ahd_linux_halt(struct notifier_block *nb, u_long event, void *buf);
static int aic79xx_setup(char *c);
/****************************** Inlines ***************************************/
static __inline void ahd_schedule_completeq(struct ahd_softc *ahd,
......@@ -801,6 +812,7 @@ static int ahd_linux_release(struct Scsi_Host *);
static const char *ahd_linux_info(struct Scsi_Host *);
static int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
#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 void ahd_linux_slave_destroy(Scsi_Device *);
static int ahd_linux_biosparam(struct scsi_device*,
......@@ -862,15 +874,6 @@ ahd_linux_detect(Scsi_Host_Template *template)
template->proc_dir = &proc_scsi_aic79xx;
#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
* probing for any adapters.
......@@ -1013,6 +1016,17 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
}
#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
ahd_linux_slave_configure(Scsi_Device *device)
{
......@@ -1021,6 +1035,8 @@ ahd_linux_slave_configure(Scsi_Device *device)
u_long flags;
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);
/*
* Since Linux has attached to the device, configure
......@@ -1032,9 +1048,10 @@ ahd_linux_slave_configure(Scsi_Device *device)
/*alloc*/TRUE);
if (dev != NULL) {
dev->flags &= ~AHD_DEV_UNCONFIGURED;
dev->flags |= AHD_DEV_SLAVE_CONFIGURED;
dev->scsi_device = device;
}
ahd_linux_device_queue_depth(ahd, dev);
}
ahd_midlayer_entrypoint_unlock(ahd, &flags);
return (0);
}
......@@ -1047,12 +1064,27 @@ ahd_linux_slave_destroy(Scsi_Device *device)
u_long flags;
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);
dev = ahd_linux_get_device(ahd, device->channel,
device->id, device->lun,
/*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;
if (TAILQ_EMPTY(&dev->busyq)
&& dev->active == 0)
ahd_linux_free_device(ahd, dev);
}
ahd_midlayer_entrypoint_unlock(ahd, &flags);
}
#else
......@@ -1253,7 +1285,7 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd)
#endif
ahd = *(struct ahd_softc **)cmd->host->hostdata;
#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",
ahd_name(ahd), cmd);
#endif
......@@ -1299,6 +1331,14 @@ Scsi_Host_Template aic79xx_driver_template = {
.sg_tablesize = AHD_NSEG,
.cmd_per_lun = 2,
.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 LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
/* Assume RedHat Distribution with its different HIGHIO conventions. */
......@@ -1309,6 +1349,8 @@ Scsi_Host_Template aic79xx_driver_template = {
#endif
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
.name = "aic79xx",
.slave_alloc = ahd_linux_slave_alloc,
.slave_configure = ahd_linux_slave_configure,
.slave_destroy = ahd_linux_slave_destroy,
#else
......@@ -1879,7 +1921,7 @@ ahd_linux_setup_tag_info_global(char *p)
* to a parameter with a ':' between the parameter and the value.
* ie. aic79xx=stpwlev:1,extended
*/
int
static int
aic79xx_setup(char *s)
{
int i, n;
......@@ -2683,7 +2725,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
{
u_int32_t status;
status = aic_dv_error_action(cmd, targ->inq_data);
status = aic_error_action(cmd, targ->inq_data);
#ifdef AHD_DEBUG
......@@ -2807,7 +2849,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
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);
break;
}
......@@ -2830,7 +2872,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) {
targ->dv_state_retry--;
} 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_DV_STATE_EXIT);
break;
......@@ -2874,7 +2916,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) {
targ->dv_state_retry--;
} 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_DV_STATE_EXIT);
break;
......@@ -2987,7 +3029,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) {
targ->dv_state_retry--;
} 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_DV_STATE_EXIT);
break;
......@@ -3018,7 +3060,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
case SS_NOP:
if (memcmp(targ->dv_buffer, targ->dv_buffer1,
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_DV_STATE_EXIT);
else
......@@ -3047,7 +3089,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
== CAM_REQUEUE_REQ) {
targ->dv_state_retry--;
} 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_DV_STATE_EXIT);
break;
......@@ -3126,7 +3168,7 @@ ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
}
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;
cam_status status;
......@@ -3392,6 +3434,19 @@ ahd_linux_calc_speed(u_int width, u_int period, u_int offset)
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
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_transinfo *goal;
struct ahd_tmode_tstate *tstate;
u_long s;
u_int width;
u_int period;
u_int offset;
......@@ -3415,7 +3469,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
printf("Trying to fallback\n");
}
#endif
ahd_lock(ahd, &s);
targ = ahd->platform_data->targets[devinfo->target_offset];
tinfo = ahd_fetch_transinfo(ahd, devinfo->channel,
devinfo->our_scsiid,
......@@ -3545,7 +3598,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
ppr_options = targ->dv_max_ppr_options;
}
} else {
ahd_unlock(ahd, &s);
return (-1);
}
offset = MAX_OFFSET;
......@@ -3563,7 +3615,6 @@ ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
ahd_set_syncrate(ahd, devinfo, period, offset,
ppr_options, AHD_TRANS_GOAL, FALSE);
targ->dv_last_ppr_options = ppr_options;
ahd_unlock(ahd, &s);
return (0);
}
......@@ -3966,6 +4017,15 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
dev->openings--;
dev->active++;
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)
dev->commands_since_idle_or_otag++;
scb->flags |= SCB_ACTIVE;
......@@ -4377,43 +4437,45 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
* structure if it is available.
*/
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_offset;
if (scb->flags & SCB_SENSE) {
sense_size = MIN(sizeof(struct scsi_sense_data)
- ahd_get_sense_residual(scb),
sizeof(cmd->sense_buffer));
memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
memcpy(cmd->sense_buffer,
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;
sense_offset = 0;
} else {
/*
* 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;
sense_len = MIN(scsi_4btoul(siu->sense_length),
siu = (struct scsi_status_iu_header *)
scb->sense_data;
sense_size = MIN(scsi_4btoul(siu->sense_length),
sizeof(cmd->sense_buffer));
sense_offset = SIU_SENSE_OFFSET(siu);
}
memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
memcpy(cmd->sense_buffer,
ahd_get_sense_buf(ahd, scb)
+ SIU_SENSE_OFFSET(siu),
sense_len);
+ sense_offset, sense_size);
cmd->result |= (DRIVER_SENSE << 24);
#ifdef AHD_DEBUG
if (ahd_debug & AHD_SHOW_SENSE) {
int i;
printf("Copied %d bytes of sense data at %d:",
sense_len, SIU_SENSE_OFFSET(siu));
for (i = 0; i < sense_len; i++)
sense_size, sense_offset);
for (i = 0; i < sense_size; i++)
printf(" 0x%x", cmd->sense_buffer[i]);
printf("\n");
}
#endif
cmd->result |= (DRIVER_SENSE << 24);
}
break;
}
......@@ -4529,9 +4591,43 @@ ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, Scsi_Cmnd *cmd)
* state change decisions.
*/
if (AHD_DV_CMD(cmd) == FALSE) {
uint32_t 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_CMP:
case CAM_SCSI_STATUS_ERROR:
......
......@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* 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_
......@@ -287,7 +287,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec)
#include <linux/smp.h>
#endif
#define AIC79XX_DRIVER_VERSION "1.3.0.ALPHA3"
#define AIC79XX_DRIVER_VERSION "1.3.0.ALPHA5"
/**************************** Front End Queues ********************************/
/*
......@@ -334,7 +334,8 @@ typedef enum {
AHD_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
AHD_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
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;
struct ahd_linux_target;
......@@ -462,6 +463,12 @@ struct ahd_linux_target {
u_int dv_state_retry;
uint8_t *dv_buffer;
uint8_t *dv_buffer1;
/*
* Cumulative counter of errors.
*/
u_long errors_detected;
u_long cmds_since_error;
};
/********************* Definitions Required by the Core ***********************/
......@@ -525,6 +532,7 @@ struct ahd_platform_data {
pid_t dv_pid;
struct timer_list completeq_timer;
struct timer_list reset_timer;
struct timer_list stats_timer;
struct semaphore eh_sem;
struct semaphore dv_sem;
struct semaphore dv_cmd_sem; /* XXX This needs to be in
......
......@@ -37,7 +37,7 @@
* String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
* 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_inline.h"
......@@ -103,7 +103,7 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)
u_int mb;
if (tinfo->period == AHD_PERIOD_UNKNOWN) {
copy_info(info, "Renegotiation Pending");
copy_info(info, "Renegotiation Pending\n");
return;
}
speed = 3300;
......@@ -181,6 +181,7 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,
ahd_format_transinfo(info, &tinfo->goal);
copy_info(info, "\tCurr: ");
ahd_format_transinfo(info, &tinfo->curr);
copy_info(info, "\tTransmission Errors %ld\n", targ->errors_detected);
for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
struct ahd_linux_device *dev;
......
......@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/
typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
typedef struct ahd_reg_parse_entry {
......@@ -82,6 +82,13 @@ ahd_reg_print_t ahd_hs_mailbox_print;
ahd_print_register(NULL, 0, "HS_MAILBOX", 0x0b, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_seqintstat_print;
#else
......@@ -89,6 +96,13 @@ ahd_reg_print_t ahd_seqintstat_print;
ahd_print_register(NULL, 0, "SEQINTSTAT", 0x0c, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_snscb_qoff_print;
#else
......@@ -1629,13 +1643,6 @@ ahd_reg_print_t ahd_dspfltrctl_print;
ahd_print_register(NULL, 0, "DSPFLTRCTL", 0xc0, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_dspdatactl_print;
#else
......@@ -1713,13 +1720,6 @@ ahd_reg_print_t ahd_rcvrbiascalc_print;
ahd_print_register(NULL, 0, "RCVRBIASCALC", 0xc8, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_dfbkptr_print;
#else
......@@ -1734,6 +1734,13 @@ ahd_reg_print_t ahd_skewcalc_print;
ahd_print_register(NULL, 0, "SKEWCALC", 0xc9, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_dfscnt_print;
#else
......@@ -1797,13 +1804,6 @@ ahd_reg_print_t ahd_prgmcnt_print;
ahd_print_register(NULL, 0, "PRGMCNT", 0xde, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_accum_print;
#else
......@@ -2140,11 +2140,53 @@ ahd_reg_print_t ahd_allocfifo_scbptr_print;
ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", 0x148, regvalue, cur_col, wrap)
#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
ahd_reg_print_t ahd_cmdsize_table_print;
#else
#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
#if AIC_DEBUG_REGISTERS
......@@ -2394,6 +2436,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define HS_MAILBOX 0x0b
#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 SEQ_SWTMRTO 0x10
......@@ -2402,6 +2452,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define SEQ_PCIINT 0x02
#define SEQ_SPLTINT 0x01
#define SWTIMER 0x0e
#define SNSCB_QOFF 0x10
#define SESCB_QOFF 0x12
......@@ -3332,13 +3384,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define EDGESENSE 0x10
#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 BYPASSENAB 0x80
#define DESQDIS 0x10
......@@ -3375,7 +3420,11 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define RCVRBIASCALC 0xc8
#define DFDBCTL 0xc8
#define DFBKPTR 0xc9
#define SKEWCALC 0xc9
#define DFDBCTL 0xcb
#define DFF_CIO_WR_RDY 0x20
#define DFF_CIO_RD_RDY 0x10
#define DFF_DIR_ERR 0x08
......@@ -3383,10 +3432,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define DFF_RAMBIST_DONE 0x02
#define DFF_RAMBIST_EN 0x01
#define DFBKPTR 0xc9
#define SKEWCALC 0xc9
#define DFSCNT 0xcc
#define DFBCNT 0xce
......@@ -3418,15 +3463,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define INT1_CONTEXT 0x20
#define SCS_SEQ_INT1M1 0x10
#define SCS_SEQ_INT1M0 0x08
#define INTMASK 0x06
#define INTMASK2 0x04
#define INTMASK1 0x02
#define IRET 0x01
#define SEQRAM 0xda
#define PRGMCNT 0xde
#define SWTIMER 0xe0
#define ACCUM 0xe0
#define SINDEX 0xe2
......@@ -3574,7 +3618,19 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#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
......@@ -3646,6 +3702,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define SCB_DISCONNECTED_LISTS 0x1b8
#define AHD_TIMER_US_PER_TICK 0x19
#define SCB_TRANSFER_SIZE_FULL_LUN 0x38
#define STATUS_QUEUE_FULL 0x28
#define STATUS_BUSY 0x08
......@@ -3667,6 +3724,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define AHD_NUM_PER_DEV_ANNEXCOLS 0x04
#define B_CURRFIFO_0 0x02
#define NVRAM_SCB_OFFSET 0x2c
#define AHD_TIMER_MAX_US 0x18ffe7
#define AHD_TIMER_MAX_TICKS 0xffff
#define STATUS_PKT_SENSE 0xff
#define CMD_GROUP_CODE_SHIFT 0x05
#define AHD_SENSE_BUFSIZE 0x100
......@@ -3713,4 +3772,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
/* Exported Labels */
#define LABEL_seq_isr 0x23b
#define LABEL_seq_isr 0x25a
#define LABEL_timer_isr 0x256
......@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/
#include "aic79xx_osm.h"
......@@ -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[] = {
{ "ENINT_COALESS", 0x40, 0x40 },
{ "HOST_TQINPOS", 0x80, 0x80 }
};
int
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));
}
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[] = {
{ "SEQ_SPLTINT", 0x01, 0x01 },
{ "SEQ_PCIINT", 0x02, 0x02 },
......@@ -183,6 +199,13 @@ ahd_seqintstat_print(u_int regvalue, u_int *cur_col, u_int 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
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)
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[] = {
{ "XMITOFFSTDIS", 0x02, 0x02 },
{ "RCVROFFSTDIS", 0x04, 0x04 },
......@@ -2838,6 +2846,20 @@ ahd_rcvrbiascalc_print(u_int regvalue, u_int *cur_col, u_int 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[] = {
{ "DFF_RAMBIST_EN", 0x01, 0x01 },
{ "DFF_RAMBIST_DONE", 0x02, 0x02 },
......@@ -2851,21 +2873,7 @@ int
ahd_dfdbctl_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(DFDBCTL_parse_table, 6, "DFDBCTL",
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));
0xcb, regvalue, cur_col, wrap));
}
int
......@@ -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[] = {
{ "IRET", 0x01, 0x01 },
{ "INTMASK", 0x06, 0x06 },
{ "INTMASK1", 0x02, 0x02 },
{ "INTMASK2", 0x04, 0x04 },
{ "SCS_SEQ_INT1M0", 0x08, 0x08 },
{ "SCS_SEQ_INT1M1", 0x10, 0x10 },
{ "INT1_CONTEXT", 0x20, 0x20 },
......@@ -2945,7 +2954,7 @@ static ahd_reg_parse_entry_t SEQINTCTL_parse_table[] = {
int
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));
}
......@@ -2963,13 +2972,6 @@ ahd_prgmcnt_print(u_int regvalue, u_int *cur_col, u_int 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
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)
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
ahd_cmdsize_table_print(u_int regvalue, u_int *cur_col, u_int wrap)
{
return (ahd_print_register(NULL, 0, "CMDSIZE_TABLE",
0x14a, regvalue, cur_col, wrap));
0x152, regvalue, cur_col, wrap));
}
int
......
......@@ -2,104 +2,128 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#74 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#56 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#77 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#59 $
*/
static uint8_t seqprog[] = {
0xff, 0x02, 0x06, 0x78,
0x00, 0xea, 0x06, 0x59,
0x00, 0xea, 0x3c, 0x59,
0x01, 0xea, 0x04, 0x30,
0xff, 0x04, 0x0c, 0x78,
0x17, 0xea, 0x06, 0x59,
0x17, 0xea, 0x3c, 0x59,
0x17, 0xea, 0x04, 0x00,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x60, 0x3a, 0x1a, 0x68,
0x04, 0x47, 0x1b, 0x68,
0xff, 0x21, 0x1b, 0x70,
0x40, 0x4b, 0x48, 0x69,
0x00, 0xe2, 0x0a, 0x59,
0x40, 0x4b, 0x48, 0x69,
0x20, 0x4b, 0x38, 0x69,
0x40, 0x4b, 0x7e, 0x69,
0x00, 0xe2, 0x40, 0x59,
0x40, 0x4b, 0x7e, 0x69,
0x20, 0x4b, 0x6e, 0x69,
0xfc, 0x42, 0x24, 0x78,
0x10, 0x40, 0x24, 0x78,
0x00, 0xe2, 0x4e, 0x5d,
0x00, 0xe2, 0x8c, 0x5d,
0x20, 0x4d, 0x28, 0x78,
0x00, 0xe2, 0x4e, 0x5d,
0x00, 0xe2, 0x8c, 0x5d,
0x00, 0xe2, 0x34, 0x58,
0x00, 0xe2, 0x5c, 0x58,
0x00, 0xe2, 0x6c, 0x58,
0x00, 0xe2, 0x06, 0x40,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x01, 0x52, 0x10, 0x7d,
0x01, 0x52, 0x4e, 0x7d,
0x02, 0x58, 0x50, 0x31,
0xff, 0xea, 0x10, 0x0b,
0x08, 0xa8, 0x51, 0x03,
0x01, 0xa4, 0x43, 0x78,
0x00, 0xe2, 0xfc, 0x5a,
0x00, 0xe2, 0x32, 0x5b,
0x00, 0xe2, 0x34, 0x40,
0xff, 0xea, 0xd4, 0x19,
0x02, 0xa8, 0x84, 0x32,
0x00, 0xea, 0xfa, 0x58,
0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30,
0x00, 0xe2, 0x42, 0x5d,
0x00, 0xe2, 0x10, 0x4d,
0x11, 0xea, 0xfa, 0x58,
0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0x4e, 0x4d,
0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00,
0x00, 0xe2, 0x42, 0x5d,
0x00, 0xe2, 0x10, 0x4d,
0x33, 0xea, 0xfa, 0x58,
0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0x4e, 0x4d,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x00, 0xe2, 0xf2, 0x42,
0x00, 0xea, 0xfa, 0x58,
0x00, 0xe2, 0x28, 0x43,
0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30,
0x80, 0xf9, 0x64, 0x68,
0x00, 0xe2, 0xf8, 0x58,
0x11, 0xea, 0xfa, 0x58,
0x00, 0xe2, 0x2e, 0x59,
0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00,
0x80, 0xf9, 0xf8, 0x78,
0x80, 0xf9, 0x2e, 0x79,
0xff, 0xea, 0xd4, 0x0d,
0x22, 0xea, 0xfa, 0x58,
0x22, 0xea, 0x30, 0x59,
0x22, 0xea, 0x00, 0x00,
0x18, 0xad, 0xb4, 0x78,
0x04, 0xad, 0x88, 0x68,
0x80, 0xad, 0x10, 0x7d,
0x10, 0xad, 0x7a, 0x78,
0x10, 0x16, 0x76, 0x78,
0x01, 0x0b, 0xa2, 0x32,
0x10, 0x16, 0x2c, 0x00,
0x18, 0xad, 0xe4, 0x78,
0x04, 0xad, 0xb2, 0x68,
0x80, 0xad, 0x4e, 0x7d,
0x10, 0xad, 0x80, 0x78,
0xe7, 0xad, 0x5a, 0x0d,
0xe7, 0xad, 0x5a, 0x09,
0x02, 0xea, 0x02, 0x00,
0x00, 0xe2, 0x8e, 0x58,
0xff, 0xea, 0x56, 0x02,
0x04, 0x7c, 0x78, 0x32,
0x20, 0x16, 0x10, 0x7d,
0x20, 0x16, 0x4e, 0x7d,
0x04, 0x38, 0x79, 0x32,
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,
0x02, 0xa8, 0x40, 0x31,
0xff, 0xea, 0xc0, 0x09,
0x01, 0x4e, 0x9d, 0x1a,
0x00, 0x4f, 0x9f, 0x22,
0x04, 0x94, 0x49, 0x32,
0xff, 0xea, 0x2a, 0x03,
0xff, 0xea, 0x2e, 0x03,
0x01, 0x10, 0xd4, 0x31,
0x10, 0xa8, 0xa9, 0x68,
0x10, 0xa8, 0xd9, 0x68,
0x3d, 0xa9, 0xc5, 0x29,
0xfe, 0xe2, 0xc4, 0x09,
0x01, 0xea, 0xc6, 0x01,
0x02, 0xe2, 0xc8, 0x31,
0x02, 0xec, 0x50, 0x31,
0x02, 0xa0, 0xda, 0x31,
0xff, 0xa9, 0xa8, 0x70,
0xff, 0xa9, 0xd8, 0x70,
0x02, 0xa0, 0x28, 0x37,
0xff, 0x21, 0xb1, 0x70,
0xff, 0x21, 0xe1, 0x70,
0x02, 0x22, 0x51, 0x31,
0x02, 0xa0, 0x2c, 0x33,
0x02, 0xa0, 0x44, 0x36,
0x02, 0xa0, 0x40, 0x32,
0x02, 0xa0, 0x44, 0x36,
0x04, 0x47, 0xb9, 0x68,
0x40, 0x16, 0xde, 0x68,
0xff, 0x2d, 0xe3, 0x60,
0xff, 0x29, 0x11, 0x75,
0x04, 0x47, 0xe9, 0x68,
0x40, 0x16, 0x14, 0x69,
0xff, 0x2d, 0x19, 0x61,
0xff, 0x29, 0x4f, 0x75,
0x01, 0x37, 0xc1, 0x31,
0x02, 0x28, 0x55, 0x32,
0x01, 0xea, 0x5a, 0x01,
......@@ -108,20 +132,23 @@ static uint8_t seqprog[] = {
0x01, 0xa8, 0x60, 0x31,
0x00, 0xa9, 0x60, 0x01,
0x01, 0x14, 0xd4, 0x31,
0xff, 0x8d, 0xd7, 0x70,
0x80, 0xac, 0xd6, 0x70,
0x20, 0x16, 0xd6, 0x68,
0x01, 0x50, 0xa1, 0x1a,
0xff, 0x4e, 0x9d, 0x1a,
0xff, 0x4f, 0x9f, 0x22,
0xff, 0x8d, 0x0d, 0x71,
0x80, 0xac, 0x0c, 0x71,
0x20, 0x16, 0x0c, 0x69,
0x02, 0x8c, 0x51, 0x31,
0x00, 0xe2, 0xc6, 0x40,
0x00, 0xe2, 0xf6, 0x40,
0x01, 0xac, 0x08, 0x31,
0x09, 0xea, 0x5a, 0x01,
0x02, 0x8c, 0x51, 0x32,
0xff, 0xea, 0x1a, 0x07,
0x04, 0x24, 0xf9, 0x30,
0x1d, 0xea, 0xee, 0x40,
0x1d, 0xea, 0x24, 0x41,
0x02, 0x2c, 0x51, 0x31,
0x04, 0xac, 0xf9, 0x30,
0x19, 0xea, 0xee, 0x58,
0x19, 0xea, 0x24, 0x59,
0x02, 0x8c, 0x59, 0x32,
0x02, 0x28, 0x19, 0x33,
0x02, 0xa8, 0x50, 0x36,
......@@ -143,23 +170,23 @@ static uint8_t seqprog[] = {
0x02, 0x20, 0xb9, 0x30,
0x02, 0x20, 0x51, 0x31,
0x4c, 0xa9, 0xd7, 0x28,
0x10, 0xa8, 0x19, 0x79,
0x10, 0xa8, 0x4f, 0x79,
0x01, 0x6b, 0xc0, 0x30,
0x02, 0x64, 0xc8, 0x00,
0x40, 0x3a, 0x74, 0x04,
0x00, 0xe2, 0x5c, 0x58,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x30, 0x3f, 0xc0, 0x09,
0x30, 0xe0, 0x1a, 0x61,
0x20, 0x3f, 0x30, 0x69,
0x10, 0x3f, 0x1a, 0x79,
0x30, 0xe0, 0x50, 0x61,
0x20, 0x3f, 0x66, 0x69,
0x10, 0x3f, 0x50, 0x79,
0x02, 0xea, 0x7e, 0x00,
0x00, 0xea, 0xfa, 0x58,
0x00, 0xea, 0x30, 0x59,
0x01, 0xea, 0x00, 0x30,
0x02, 0x48, 0x51, 0x35,
0x01, 0xea, 0x7e, 0x00,
0x11, 0xea, 0xfa, 0x58,
0x11, 0xea, 0x30, 0x59,
0x11, 0xea, 0x00, 0x00,
0x02, 0x48, 0x51, 0x35,
0x08, 0xea, 0x98, 0x00,
......@@ -169,11 +196,11 @@ static uint8_t seqprog[] = {
0x0f, 0x67, 0xc0, 0x09,
0x00, 0x34, 0x69, 0x02,
0x20, 0xea, 0x96, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x40, 0x3a, 0x64, 0x69,
0x00, 0xe2, 0xdc, 0x41,
0x40, 0x3a, 0x9a, 0x69,
0x02, 0x55, 0x06, 0x68,
0x02, 0x56, 0x64, 0x69,
0xff, 0x5b, 0x64, 0x61,
0x02, 0x56, 0x9a, 0x69,
0xff, 0x5b, 0x9a, 0x61,
0x02, 0x20, 0x51, 0x31,
0x80, 0xea, 0xb2, 0x01,
0x44, 0xea, 0x00, 0x00,
......@@ -181,33 +208,33 @@ static uint8_t seqprog[] = {
0x33, 0xea, 0x00, 0x00,
0xff, 0xea, 0xb2, 0x09,
0xff, 0xe0, 0xc0, 0x19,
0xff, 0xe0, 0x66, 0x79,
0xff, 0xe0, 0x9c, 0x79,
0x02, 0x94, 0x51, 0x31,
0x00, 0xe2, 0x5c, 0x41,
0x00, 0xe2, 0x92, 0x41,
0x02, 0x5e, 0x50, 0x31,
0x02, 0xa8, 0xb8, 0x30,
0x02, 0x5c, 0x50, 0x31,
0xff, 0x95, 0x77, 0x71,
0xff, 0x95, 0xad, 0x71,
0x02, 0x94, 0x41, 0x31,
0x02, 0x22, 0x51, 0x31,
0x02, 0xa0, 0x2c, 0x33,
0x02, 0xa0, 0x44, 0x32,
0x00, 0xe2, 0x80, 0x41,
0x10, 0xa8, 0x81, 0x69,
0x00, 0xe2, 0xb6, 0x41,
0x10, 0xa8, 0xb7, 0x69,
0x3d, 0xa9, 0xc9, 0x29,
0x01, 0xe4, 0xc8, 0x01,
0x01, 0xea, 0xca, 0x01,
0xff, 0xea, 0xda, 0x01,
0x02, 0x20, 0x51, 0x31,
0x02, 0x96, 0x41, 0x32,
0xff, 0x21, 0x89, 0x61,
0xff, 0x21, 0xbf, 0x61,
0xff, 0xea, 0x46, 0x02,
0x02, 0x5c, 0x50, 0x31,
0x40, 0xea, 0x96, 0x00,
0x02, 0x56, 0x56, 0x6d,
0x01, 0x55, 0x56, 0x6d,
0x10, 0xa8, 0x95, 0x79,
0x10, 0x40, 0x96, 0x69,
0x02, 0x56, 0x94, 0x6d,
0x01, 0x55, 0x94, 0x6d,
0x10, 0xa8, 0xcb, 0x79,
0x10, 0x40, 0xcc, 0x69,
0x01, 0x56, 0x06, 0x68,
0xbf, 0x3a, 0x74, 0x08,
0x08, 0xea, 0x98, 0x00,
......@@ -217,104 +244,104 @@ static uint8_t seqprog[] = {
0x08, 0x3c, 0x78, 0x00,
0x80, 0xea, 0x62, 0x02,
0x40, 0xea, 0x66, 0x02,
0x00, 0xe2, 0x5c, 0x5b,
0x00, 0xe2, 0x92, 0x5b,
0x01, 0x36, 0xc1, 0x31,
0x9f, 0xe0, 0xf0, 0x7b,
0x80, 0xe0, 0xba, 0x71,
0xa0, 0xe0, 0xf2, 0x71,
0xc0, 0xe0, 0xe8, 0x71,
0xe0, 0xe0, 0x22, 0x72,
0x01, 0xea, 0x06, 0x59,
0x9f, 0xe0, 0x26, 0x7c,
0x80, 0xe0, 0xf0, 0x71,
0xa0, 0xe0, 0x28, 0x72,
0xc0, 0xe0, 0x1e, 0x72,
0xe0, 0xe0, 0x58, 0x72,
0x01, 0xea, 0x3c, 0x59,
0x01, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x80, 0x33, 0xc1, 0x79,
0x03, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xdc, 0x41,
0x80, 0x33, 0xf7, 0x79,
0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00,
0xee, 0x00, 0xc8, 0x69,
0xee, 0x00, 0xfe, 0x69,
0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x02, 0xa8, 0x90, 0x32,
0x00, 0xe2, 0x20, 0x59,
0x00, 0xe2, 0x56, 0x59,
0xef, 0x92, 0xd5, 0x19,
0x00, 0xe2, 0xd8, 0x51,
0x00, 0xe2, 0x0e, 0x52,
0x0b, 0x84, 0xe1, 0x30,
0x02, 0xea, 0x36, 0x00,
0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0xde, 0x41,
0x00, 0xe2, 0x14, 0x42,
0x01, 0x92, 0xd1, 0x30,
0x10, 0x80, 0x89, 0x31,
0x20, 0xea, 0x32, 0x00,
0xbf, 0x33, 0x67, 0x0a,
0x20, 0x19, 0xe0, 0x69,
0x02, 0x4d, 0xa6, 0x69,
0x20, 0x19, 0x16, 0x6a,
0x02, 0x4d, 0xdc, 0x69,
0x40, 0x33, 0x67, 0x02,
0x00, 0xe2, 0xa6, 0x41,
0x80, 0x33, 0x5f, 0x6a,
0x00, 0xe2, 0xdc, 0x41,
0x80, 0x33, 0x95, 0x6a,
0x01, 0x44, 0x10, 0x33,
0x08, 0xa8, 0x51, 0x03,
0x00, 0xe2, 0xa6, 0x41,
0x00, 0xe2, 0xdc, 0x41,
0x10, 0xea, 0x80, 0x00,
0x01, 0x31, 0xc5, 0x31,
0x80, 0xe2, 0x0e, 0x62,
0x10, 0xa8, 0x33, 0x6a,
0x80, 0xe2, 0x44, 0x62,
0x10, 0xa8, 0x69, 0x6a,
0xc0, 0xaa, 0xc5, 0x01,
0x40, 0xa8, 0xff, 0x69,
0x40, 0xa8, 0x35, 0x6a,
0xbf, 0xe2, 0xc4, 0x09,
0x20, 0xa8, 0x13, 0x7a,
0x20, 0xa8, 0x49, 0x7a,
0x01, 0xe2, 0x88, 0x30,
0x00, 0xe2, 0x5c, 0x5b,
0xa0, 0x36, 0x1b, 0x62,
0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0x51, 0x62,
0x23, 0xa8, 0x89, 0x08,
0x00, 0xe2, 0x5c, 0x5b,
0xa0, 0x36, 0x1b, 0x62,
0x00, 0xa8, 0x12, 0x42,
0xff, 0xe2, 0x12, 0x62,
0x00, 0xe2, 0x32, 0x42,
0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0x51, 0x62,
0x00, 0xa8, 0x48, 0x42,
0xff, 0xe2, 0x48, 0x62,
0x00, 0xe2, 0x68, 0x42,
0x40, 0xea, 0x98, 0x00,
0x01, 0xe2, 0x88, 0x30,
0x00, 0xe2, 0x5c, 0x5b,
0xa0, 0x36, 0xf1, 0x71,
0x00, 0xe2, 0x92, 0x5b,
0xa0, 0x36, 0x27, 0x72,
0x40, 0xea, 0x98, 0x00,
0x01, 0x31, 0x89, 0x32,
0x08, 0xea, 0x62, 0x02,
0x00, 0xe2, 0xa6, 0x41,
0xe0, 0xea, 0x6c, 0x5b,
0x80, 0xe0, 0x6a, 0x6a,
0x04, 0xe0, 0x0a, 0x73,
0x02, 0xe0, 0x3a, 0x73,
0x00, 0xea, 0xc8, 0x72,
0x03, 0xe0, 0x4a, 0x73,
0x23, 0xe0, 0x44, 0x72,
0x08, 0xe0, 0x66, 0x72,
0x00, 0xe2, 0x5c, 0x5b,
0x07, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xdc, 0x41,
0xe0, 0xea, 0xa2, 0x5b,
0x80, 0xe0, 0xa0, 0x6a,
0x04, 0xe0, 0x40, 0x73,
0x02, 0xe0, 0x70, 0x73,
0x00, 0xea, 0xfe, 0x72,
0x03, 0xe0, 0x80, 0x73,
0x23, 0xe0, 0x7a, 0x72,
0x08, 0xe0, 0x9c, 0x72,
0x00, 0xe2, 0x92, 0x5b,
0x07, 0xea, 0x3c, 0x59,
0x07, 0xea, 0x04, 0x00,
0x08, 0x42, 0xa7, 0x71,
0x04, 0x42, 0x41, 0x62,
0x08, 0x42, 0xdd, 0x71,
0x04, 0x42, 0x77, 0x62,
0x01, 0x43, 0x89, 0x30,
0x00, 0xe2, 0x32, 0x42,
0x00, 0xe2, 0x68, 0x42,
0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0x32, 0x42,
0x00, 0xe2, 0x68, 0x42,
0x01, 0x00, 0x60, 0x32,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x4c, 0x34, 0xc1, 0x28,
0x01, 0x64, 0xc0, 0x31,
0x00, 0x30, 0xfb, 0x58,
0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30,
0x01, 0xe0, 0x64, 0x7a,
0xa0, 0xea, 0x62, 0x5b,
0x01, 0xa0, 0x64, 0x62,
0x01, 0x84, 0x5d, 0x7a,
0x01, 0xa7, 0x66, 0x7a,
0x00, 0xe2, 0x66, 0x42,
0x03, 0xea, 0x06, 0x59,
0x01, 0xe0, 0x9a, 0x7a,
0xa0, 0xea, 0x98, 0x5b,
0x01, 0xa0, 0x9a, 0x62,
0x01, 0x84, 0x93, 0x7a,
0x01, 0xa7, 0x9c, 0x7a,
0x00, 0xe2, 0x9c, 0x42,
0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x66, 0x42,
0x07, 0xea, 0x74, 0x5b,
0x00, 0xe2, 0x9c, 0x42,
0x07, 0xea, 0xaa, 0x5b,
0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0xa6, 0x41,
0x00, 0xe2, 0xdc, 0x41,
0x3f, 0xe0, 0x6a, 0x0a,
0xc0, 0x34, 0xc1, 0x09,
0x00, 0x35, 0x51, 0x01,
......@@ -325,54 +352,54 @@ static uint8_t seqprog[] = {
0x01, 0xea, 0xc6, 0x01,
0x02, 0xe2, 0xc8, 0x31,
0x02, 0xec, 0x40, 0x31,
0xff, 0xa1, 0x86, 0x72,
0xff, 0xa1, 0xbc, 0x72,
0x02, 0xe8, 0xda, 0x31,
0x02, 0xa0, 0x50, 0x31,
0x00, 0xe2, 0xa8, 0x42,
0x00, 0xe2, 0xde, 0x42,
0x80, 0x33, 0x67, 0x02,
0x01, 0x44, 0xd4, 0x31,
0x00, 0xe2, 0x5c, 0x5b,
0x00, 0xe2, 0x92, 0x5b,
0x01, 0x33, 0x67, 0x02,
0xe0, 0x36, 0xc3, 0x62,
0xe0, 0x36, 0xf9, 0x62,
0x02, 0x33, 0x67, 0x02,
0x20, 0x46, 0xbc, 0x62,
0x20, 0x46, 0xf2, 0x62,
0xff, 0xea, 0x52, 0x09,
0xa8, 0xea, 0x62, 0x5b,
0x04, 0xa8, 0xa3, 0x7a,
0xa8, 0xea, 0x98, 0x5b,
0x04, 0xa8, 0xd9, 0x7a,
0x01, 0x34, 0xc1, 0x31,
0x00, 0xa9, 0xa3, 0x62,
0x00, 0xa9, 0xd9, 0x62,
0x01, 0x35, 0xc1, 0x31,
0x00, 0xaa, 0xad, 0x72,
0x00, 0xaa, 0xe3, 0x72,
0x01, 0xa9, 0x52, 0x11,
0xff, 0xa9, 0x98, 0x6a,
0x00, 0xe2, 0xbc, 0x42,
0xff, 0xa9, 0xce, 0x6a,
0x00, 0xe2, 0xf2, 0x42,
0x10, 0x33, 0x67, 0x02,
0x04, 0xa8, 0xbd, 0x7a,
0x04, 0xa8, 0xf3, 0x7a,
0xfb, 0xa8, 0x51, 0x0b,
0xff, 0xea, 0x66, 0x0a,
0x01, 0xa4, 0xb7, 0x6a,
0x01, 0xa4, 0xed, 0x6a,
0x02, 0xa8, 0x90, 0x32,
0x00, 0xe2, 0x20, 0x59,
0x10, 0xa8, 0x67, 0x7a,
0xff, 0xea, 0x74, 0x5b,
0x00, 0xe2, 0x66, 0x42,
0x04, 0xea, 0x06, 0x59,
0x00, 0xe2, 0x56, 0x59,
0x10, 0xa8, 0x9d, 0x7a,
0xff, 0xea, 0xaa, 0x5b,
0x00, 0xe2, 0x9c, 0x42,
0x04, 0xea, 0x3c, 0x59,
0x04, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x66, 0x42,
0x04, 0xea, 0x06, 0x59,
0x00, 0xe2, 0x9c, 0x42,
0x04, 0xea, 0x3c, 0x59,
0x04, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x08, 0xa8, 0x5f, 0x7a,
0xc0, 0x33, 0xd3, 0x7a,
0x80, 0x33, 0x5f, 0x6a,
0xff, 0x88, 0xd3, 0x6a,
0x40, 0x33, 0x5f, 0x6a,
0x10, 0xa8, 0xd9, 0x7a,
0x0a, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xdc, 0x41,
0x08, 0xa8, 0x95, 0x7a,
0xc0, 0x33, 0x09, 0x7b,
0x80, 0x33, 0x95, 0x6a,
0xff, 0x88, 0x09, 0x6b,
0x40, 0x33, 0x95, 0x6a,
0x10, 0xa8, 0x0f, 0x7b,
0x0a, 0xea, 0x3c, 0x59,
0x0a, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xf2, 0x5a,
0x00, 0xe2, 0x26, 0x43,
0x40, 0x4b, 0xe0, 0x6a,
0x00, 0xe2, 0x28, 0x5b,
0x00, 0xe2, 0x5c, 0x43,
0x50, 0x4b, 0x16, 0x6b,
0xbf, 0x3a, 0x74, 0x08,
0x01, 0xe0, 0xf8, 0x31,
0xff, 0xea, 0xc0, 0x09,
......@@ -380,24 +407,24 @@ static uint8_t seqprog[] = {
0x00, 0x2f, 0x5f, 0x22,
0x04, 0x47, 0x8f, 0x02,
0x01, 0xfc, 0xc0, 0x35,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x02, 0x42, 0x51, 0x31,
0x10, 0xa8, 0x51, 0x03,
0xff, 0x88, 0x01, 0x6b,
0x01, 0xa4, 0xfd, 0x6a,
0x02, 0xa4, 0x05, 0x6b,
0x01, 0x84, 0x05, 0x7b,
0xff, 0x88, 0x37, 0x6b,
0x01, 0xa4, 0x33, 0x6b,
0x02, 0xa4, 0x3b, 0x6b,
0x01, 0x84, 0x3b, 0x7b,
0x02, 0x28, 0x19, 0x33,
0x02, 0xa8, 0x50, 0x36,
0xff, 0x88, 0x05, 0x73,
0x00, 0xe2, 0xdc, 0x5a,
0xff, 0x88, 0x3b, 0x73,
0x00, 0xe2, 0x12, 0x5b,
0x02, 0x2c, 0x19, 0x33,
0x02, 0xa8, 0x58, 0x32,
0x04, 0xa4, 0x49, 0x07,
0xc0, 0x33, 0x5f, 0x6a,
0xc0, 0x33, 0x95, 0x6a,
0x04, 0xa8, 0x51, 0x03,
0x20, 0xa8, 0x27, 0x6b,
0x20, 0xa8, 0x5d, 0x6b,
0x02, 0xa8, 0x40, 0x31,
0xc0, 0x34, 0xc1, 0x09,
0x00, 0x35, 0x51, 0x01,
......@@ -412,66 +439,66 @@ static uint8_t seqprog[] = {
0xf7, 0x57, 0xae, 0x08,
0x08, 0xea, 0x98, 0x00,
0x01, 0x44, 0xd4, 0x31,
0xee, 0x00, 0x30, 0x6b,
0xee, 0x00, 0x66, 0x6b,
0x02, 0xea, 0xb4, 0x00,
0x00, 0xe2, 0x58, 0x5b,
0x09, 0x4c, 0x32, 0x7b,
0x00, 0xe2, 0x8e, 0x5b,
0x09, 0x4c, 0x68, 0x7b,
0x08, 0x4c, 0x06, 0x68,
0x0b, 0xea, 0x06, 0x59,
0x0b, 0xea, 0x3c, 0x59,
0x0b, 0xea, 0x04, 0x00,
0x01, 0x44, 0xd4, 0x31,
0x20, 0x33, 0xa7, 0x79,
0x00, 0xe2, 0x42, 0x5b,
0x00, 0xe2, 0xa6, 0x41,
0x01, 0x84, 0x47, 0x7b,
0x20, 0x33, 0xdd, 0x79,
0x00, 0xe2, 0x78, 0x5b,
0x00, 0xe2, 0xdc, 0x41,
0x01, 0x84, 0x7d, 0x7b,
0x01, 0xa4, 0x49, 0x07,
0x08, 0x60, 0x30, 0x33,
0x08, 0x80, 0x41, 0x37,
0xdf, 0x33, 0x67, 0x0a,
0xee, 0x00, 0x54, 0x6b,
0xee, 0x00, 0x8a, 0x6b,
0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x00, 0xe2, 0x20, 0x59,
0x00, 0xe2, 0x66, 0x42,
0x00, 0xe2, 0x56, 0x59,
0x00, 0xe2, 0x9c, 0x42,
0x01, 0xea, 0x6c, 0x02,
0xc0, 0xea, 0x66, 0x06,
0xff, 0x42, 0x5c, 0x7b,
0x04, 0x4c, 0x5c, 0x6b,
0xff, 0x42, 0x92, 0x7b,
0x04, 0x4c, 0x92, 0x6b,
0xe0, 0x41, 0x6c, 0x0e,
0x01, 0x44, 0xd4, 0x31,
0xff, 0x42, 0x64, 0x7b,
0x04, 0x4c, 0x64, 0x6b,
0xff, 0x42, 0x9a, 0x7b,
0x04, 0x4c, 0x9a, 0x6b,
0xe0, 0x41, 0x6c, 0x0a,
0xe0, 0x36, 0xa7, 0x61,
0xe0, 0x36, 0xdd, 0x61,
0xff, 0xea, 0xca, 0x09,
0x01, 0xe2, 0xc8, 0x31,
0x01, 0x46, 0xda, 0x35,
0x01, 0x44, 0xd4, 0x35,
0x10, 0xea, 0x80, 0x00,
0x01, 0xe2, 0x62, 0x36,
0x04, 0xa6, 0x7c, 0x7b,
0x04, 0xa6, 0xb2, 0x7b,
0xff, 0xea, 0x5a, 0x09,
0xff, 0xea, 0x4c, 0x0d,
0x01, 0xa6, 0x9a, 0x6b,
0x10, 0xad, 0x10, 0x7d,
0x80, 0xad, 0x92, 0x6b,
0x08, 0xad, 0x10, 0x6d,
0x01, 0xa6, 0xd0, 0x6b,
0x10, 0xad, 0x4e, 0x7d,
0x80, 0xad, 0xc8, 0x6b,
0x08, 0xad, 0x4e, 0x6d,
0x04, 0x84, 0xf9, 0x30,
0x00, 0xea, 0x08, 0x81,
0xff, 0xea, 0xd4, 0x09,
0x02, 0x84, 0xf9, 0x88,
0x1d, 0xea, 0x5a, 0x01,
0x04, 0xa6, 0x4c, 0x05,
0x04, 0xa6, 0x10, 0x7d,
0x04, 0xa6, 0x4e, 0x7d,
0xff, 0xea, 0x5a, 0x09,
0x03, 0x84, 0x59, 0x89,
0x03, 0xea, 0x4c, 0x01,
0x80, 0x1a, 0x10, 0x7d,
0x80, 0x1a, 0x4e, 0x7d,
0x08, 0xb0, 0xe0, 0x30,
0x04, 0xb0, 0xe0, 0x30,
0x03, 0xb0, 0xf0, 0x30,
0x01, 0x78, 0xa6, 0x7b,
0x01, 0x78, 0xdc, 0x7b,
0x01, 0xa7, 0x4e, 0x11,
0x01, 0xb0, 0x06, 0x33,
0x7f, 0x83, 0xe9, 0x08,
......@@ -482,240 +509,244 @@ static uint8_t seqprog[] = {
0x00, 0x86, 0x0d, 0x23,
0x00, 0x87, 0x0f, 0x23,
0x01, 0x84, 0xc5, 0x31,
0x01, 0xa7, 0xbc, 0x7b,
0x01, 0xa7, 0xf2, 0x7b,
0x04, 0xe2, 0xc4, 0x01,
0x80, 0x83, 0xc3, 0x7b,
0x80, 0x83, 0xf9, 0x7b,
0x02, 0xe2, 0xc4, 0x01,
0xff, 0xea, 0x4c, 0x09,
0x01, 0xe2, 0x36, 0x30,
0xc8, 0x19, 0x32, 0x00,
0x88, 0x19, 0x32, 0x00,
0x01, 0xac, 0xd4, 0x99,
0x00, 0xe2, 0x10, 0x55,
0x00, 0xe2, 0x4e, 0x55,
0xfe, 0xa6, 0x4c, 0x0d,
0x0b, 0x98, 0xe1, 0x30,
0x01, 0xa0, 0x4f, 0x09,
0xfd, 0xa4, 0x49, 0x09,
0x80, 0xa3, 0xd9, 0x7b,
0x80, 0xa3, 0x0f, 0x7c,
0x02, 0xa4, 0x48, 0x01,
0x01, 0xa7, 0xdc, 0x7b,
0x01, 0xa7, 0x12, 0x7c,
0x04, 0xa4, 0x48, 0x01,
0x01, 0xa4, 0x36, 0x30,
0xa8, 0xea, 0x32, 0x00,
0xfd, 0xa4, 0x49, 0x0b,
0x05, 0xa3, 0x07, 0x33,
0x80, 0x83, 0xe9, 0x6b,
0x80, 0x83, 0x1f, 0x6c,
0x02, 0xea, 0x4c, 0x05,
0xff, 0xea, 0x4c, 0x0d,
0x00, 0xe2, 0xf2, 0x58,
0x02, 0xa6, 0x7e, 0x6b,
0x00, 0xe2, 0x28, 0x59,
0x02, 0xa6, 0xb4, 0x6b,
0x80, 0xf9, 0xf2, 0x05,
0xc0, 0x33, 0xf7, 0x7b,
0x03, 0xea, 0x06, 0x59,
0xc0, 0x33, 0x2d, 0x7c,
0x03, 0xea, 0x3c, 0x59,
0x03, 0xea, 0x04, 0x00,
0x20, 0x33, 0x1b, 0x7c,
0x01, 0x84, 0x01, 0x6c,
0x06, 0xea, 0x06, 0x59,
0x20, 0x33, 0x51, 0x7c,
0x01, 0x84, 0x37, 0x6c,
0x06, 0xea, 0x3c, 0x59,
0x06, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x1e, 0x44,
0x00, 0xe2, 0x54, 0x44,
0x01, 0x00, 0x60, 0x32,
0xee, 0x00, 0x0a, 0x6c,
0xee, 0x00, 0x40, 0x6c,
0x05, 0xea, 0xb4, 0x00,
0x33, 0xea, 0xfa, 0x58,
0x33, 0xea, 0x30, 0x59,
0x33, 0xea, 0x00, 0x00,
0x80, 0x3d, 0x7a, 0x00,
0xfc, 0x42, 0x0c, 0x7c,
0xfc, 0x42, 0x42, 0x7c,
0x7f, 0x3d, 0x7a, 0x08,
0x00, 0x30, 0xfb, 0x58,
0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30,
0x09, 0xea, 0x06, 0x59,
0x09, 0xea, 0x3c, 0x59,
0x09, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x01, 0xa4, 0x01, 0x6c,
0x00, 0xe2, 0xce, 0x5b,
0x00, 0xe2, 0xdc, 0x41,
0x01, 0xa4, 0x37, 0x6c,
0x00, 0xe2, 0x04, 0x5c,
0x20, 0x33, 0x67, 0x02,
0x01, 0x00, 0x60, 0x32,
0x02, 0xa6, 0x26, 0x7c,
0x00, 0xe2, 0xea, 0x5b,
0x02, 0xa6, 0x5c, 0x7c,
0x00, 0xe2, 0x20, 0x5c,
0x00, 0xe2, 0x5c, 0x58,
0x00, 0xe2, 0x6c, 0x58,
0x00, 0xe2, 0x30, 0x58,
0x00, 0x30, 0xfb, 0x58,
0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30,
0x20, 0x19, 0x26, 0x6c,
0x00, 0xe2, 0x4e, 0x5c,
0x04, 0x19, 0x40, 0x6c,
0x20, 0x19, 0x5c, 0x6c,
0x00, 0xe2, 0x84, 0x5c,
0x04, 0x19, 0x76, 0x6c,
0x02, 0x19, 0x32, 0x00,
0x01, 0x84, 0x41, 0x7c,
0x01, 0x1b, 0x3a, 0x7c,
0x01, 0x1a, 0x40, 0x6c,
0x00, 0xe2, 0xf0, 0x43,
0x80, 0x4b, 0x46, 0x6c,
0x01, 0x4c, 0x42, 0x7c,
0x03, 0x42, 0xf0, 0x6b,
0x00, 0xe2, 0x78, 0x5b,
0x01, 0x84, 0x77, 0x7c,
0x01, 0x1b, 0x70, 0x7c,
0x01, 0x1a, 0x76, 0x6c,
0x00, 0xe2, 0x26, 0x44,
0x80, 0x4b, 0x7c, 0x6c,
0x01, 0x4c, 0x78, 0x7c,
0x03, 0x42, 0x26, 0x6c,
0x00, 0xe2, 0xae, 0x5b,
0x80, 0xf9, 0xf2, 0x01,
0x04, 0x33, 0xa7, 0x79,
0x00, 0xe2, 0xa6, 0x41,
0x02, 0x1b, 0x56, 0x7c,
0x08, 0x5d, 0x54, 0x7c,
0x04, 0x33, 0xdd, 0x79,
0x00, 0xe2, 0xdc, 0x41,
0x02, 0x1b, 0x8c, 0x7c,
0x08, 0x5d, 0x8a, 0x7c,
0x03, 0x68, 0x00, 0x37,
0x01, 0x84, 0x09, 0x07,
0x08, 0x5d, 0x60, 0x6c,
0x08, 0x5d, 0x96, 0x6c,
0x00, 0xe2, 0x5c, 0x58,
0x00, 0x30, 0xfb, 0x58,
0x00, 0x30, 0x31, 0x59,
0x01, 0x30, 0x01, 0x30,
0x00, 0xe2, 0x4e, 0x44,
0x80, 0x1b, 0x6a, 0x7c,
0x80, 0x84, 0x6b, 0x6c,
0x00, 0xe2, 0x84, 0x44,
0x80, 0x1b, 0xa0, 0x7c,
0x80, 0x84, 0xa1, 0x6c,
0xff, 0x85, 0x0b, 0x1b,
0xff, 0x86, 0x0d, 0x23,
0xff, 0x87, 0x0f, 0x23,
0xf8, 0x1b, 0x08, 0x0b,
0xff, 0xea, 0x4e, 0x09,
0x04, 0x1b, 0x72, 0x7c,
0x04, 0x1b, 0xa8, 0x7c,
0x01, 0xa7, 0x4e, 0x01,
0xff, 0xea, 0x06, 0x0b,
0x03, 0x68, 0x00, 0x37,
0x00, 0xe2, 0xac, 0x58,
0x10, 0xea, 0x18, 0x00,
0xf9, 0xd9, 0xb2, 0x0d,
0x01, 0xd9, 0xb2, 0x05,
0xff, 0xea, 0xd4, 0x09,
0x20, 0x5b, 0x84, 0x6c,
0x10, 0x5b, 0x8e, 0x6c,
0x08, 0x5b, 0x96, 0x6c,
0x02, 0x5b, 0xa4, 0x6d,
0x0e, 0xea, 0x06, 0x59,
0x10, 0x5b, 0xcc, 0x6c,
0x08, 0x5b, 0xd4, 0x6c,
0x20, 0x5b, 0xc2, 0x6c,
0x02, 0x5b, 0xe2, 0x6d,
0x0e, 0xea, 0x3c, 0x59,
0x0e, 0xea, 0x04, 0x00,
0x08, 0x19, 0x8a, 0x7c,
0x08, 0x19, 0xc8, 0x7c,
0xdf, 0x5c, 0xb8, 0x08,
0x01, 0xd9, 0xb2, 0x05,
0x02, 0xea, 0xb4, 0x00,
0x01, 0xd9, 0xb2, 0x05,
0x01, 0xa4, 0x6d, 0x6d,
0x00, 0xe2, 0xce, 0x5b,
0x00, 0xe2, 0xb0, 0x5c,
0x01, 0xa4, 0xab, 0x6d,
0x00, 0xe2, 0x04, 0x5c,
0x00, 0xe2, 0xee, 0x5c,
0x01, 0xd9, 0xb2, 0x05,
0x00, 0xe2, 0xdc, 0x5a,
0x00, 0xe2, 0x12, 0x5b,
0xf3, 0x92, 0xd5, 0x19,
0x00, 0xe2, 0xa4, 0x54,
0x80, 0x92, 0xa5, 0x6c,
0x0f, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xe2, 0x54,
0x80, 0x92, 0xe3, 0x6c,
0x0f, 0xea, 0x3c, 0x59,
0x0f, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xac, 0x44,
0x00, 0xe2, 0xea, 0x44,
0x04, 0x8c, 0xe1, 0x30,
0x01, 0xea, 0xf2, 0x00,
0x02, 0xea, 0x36, 0x00,
0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0x32, 0x5d,
0x00, 0xe2, 0x70, 0x5d,
0x01, 0xd9, 0xb2, 0x05,
0x02, 0xa8, 0xf4, 0x31,
0x02, 0xa6, 0xc2, 0x7c,
0x00, 0xe2, 0xf4, 0x58,
0x20, 0x5b, 0xd0, 0x6c,
0xfc, 0x42, 0xbc, 0x7c,
0x10, 0x40, 0xbe, 0x6c,
0x20, 0x4d, 0xc0, 0x7c,
0x08, 0x5d, 0xd0, 0x6c,
0x02, 0xa6, 0x7e, 0x6b,
0x00, 0xe2, 0xf4, 0x58,
0x20, 0x5b, 0xd0, 0x6c,
0x01, 0x1b, 0xf0, 0x6c,
0xfc, 0x42, 0xcc, 0x7c,
0x10, 0x40, 0xce, 0x6c,
0x20, 0x4d, 0x10, 0x7d,
0x08, 0x5d, 0x10, 0x7d,
0x02, 0xa6, 0x00, 0x7d,
0x00, 0xe2, 0x2a, 0x59,
0x20, 0x5b, 0x0e, 0x6d,
0xfc, 0x42, 0xfa, 0x7c,
0x10, 0x40, 0xfc, 0x6c,
0x20, 0x4d, 0xfe, 0x7c,
0x08, 0x5d, 0x0e, 0x6d,
0x02, 0xa6, 0xb4, 0x6b,
0x00, 0xe2, 0x2a, 0x59,
0x20, 0x5b, 0x0e, 0x6d,
0x01, 0x1b, 0x2e, 0x6d,
0xfc, 0x42, 0x0a, 0x7d,
0x10, 0x40, 0x0c, 0x6d,
0x20, 0x4d, 0x4e, 0x7d,
0x08, 0x5d, 0x4e, 0x7d,
0x02, 0x19, 0x32, 0x00,
0x01, 0x5b, 0x40, 0x31,
0x00, 0xe2, 0x4e, 0x5c,
0x00, 0xe2, 0x42, 0x5b,
0x20, 0xea, 0xb6, 0x00,
0x00, 0xe2, 0x84, 0x5c,
0x00, 0xe2, 0x78, 0x5b,
0x20, 0xea, 0xb6, 0x00,
0x00, 0xe2, 0xae, 0x5b,
0x20, 0x5c, 0xb8, 0x00,
0x04, 0x19, 0xe6, 0x6c,
0x01, 0x1a, 0xe6, 0x6c,
0x00, 0xe2, 0xf4, 0x58,
0x01, 0x1a, 0x10, 0x7d,
0x04, 0x19, 0x24, 0x6d,
0x01, 0x1a, 0x24, 0x6d,
0x00, 0xe2, 0x2a, 0x59,
0x01, 0x1a, 0x4e, 0x7d,
0x80, 0xf9, 0xf2, 0x01,
0x20, 0xa0, 0x56, 0x7d,
0x08, 0xa8, 0xef, 0x7c,
0x00, 0xe2, 0x02, 0x45,
0x20, 0xa0, 0x94, 0x7d,
0x08, 0xa8, 0x2d, 0x7d,
0x00, 0xe2, 0x40, 0x45,
0x02, 0xea, 0xb4, 0x04,
0x02, 0x19, 0x32, 0x00,
0x08, 0xa8, 0x13, 0x7d,
0x04, 0x5d, 0x6c, 0x7d,
0x01, 0x1a, 0x6c, 0x7d,
0x08, 0xa8, 0x51, 0x7d,
0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0xaa, 0x7d,
0x01, 0xa4, 0x49, 0x03,
0x80, 0xf9, 0xf2, 0x01,
0x02, 0xa8, 0x84, 0x32,
0x02, 0xea, 0xb4, 0x00,
0x00, 0xe2, 0xec, 0x42,
0x00, 0xe2, 0x22, 0x43,
0x02, 0xa8, 0x84, 0x32,
0x02, 0xea, 0xb4, 0x00,
0xff, 0xea, 0xd4, 0x19,
0x00, 0xe2, 0x00, 0x59,
0x00, 0xe2, 0x36, 0x59,
0x11, 0x00, 0x00, 0x10,
0x00, 0xe2, 0x42, 0x5d,
0x00, 0xe2, 0xec, 0x52,
0x00, 0xe2, 0x80, 0x5d,
0x00, 0xe2, 0x22, 0x53,
0xff, 0xea, 0xd4, 0x0d,
0x00, 0xe2, 0xf4, 0x58,
0x40, 0x5b, 0x1e, 0x6d,
0x04, 0x5d, 0x6c, 0x7d,
0x01, 0x1a, 0x6c, 0x7d,
0x20, 0x4d, 0x10, 0x7d,
0x40, 0x5b, 0x56, 0x7d,
0x04, 0x5d, 0x6c, 0x7d,
0x01, 0x1a, 0x6c, 0x7d,
0x00, 0xe2, 0x2a, 0x59,
0x40, 0x5b, 0x5c, 0x6d,
0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0xaa, 0x7d,
0x20, 0x4d, 0x4e, 0x7d,
0x40, 0x5b, 0x94, 0x7d,
0x04, 0x5d, 0xaa, 0x7d,
0x01, 0x1a, 0xaa, 0x7d,
0x80, 0xf9, 0xf2, 0x01,
0x01, 0xa4, 0x49, 0x03,
0x08, 0xa8, 0x03, 0x6d,
0x08, 0xa8, 0x41, 0x6d,
0x02, 0xea, 0xb4, 0x04,
0xff, 0x6a, 0x38, 0x7d,
0x10, 0xea, 0x06, 0x59,
0xff, 0x6a, 0x76, 0x7d,
0x10, 0xea, 0x3c, 0x59,
0x10, 0xea, 0x04, 0x00,
0x00, 0xe2, 0x38, 0x45,
0x00, 0xe2, 0xf2, 0x58,
0x10, 0x5d, 0x2a, 0x6d,
0x40, 0x5b, 0x10, 0x7d,
0x00, 0xe2, 0x76, 0x45,
0x00, 0xe2, 0x28, 0x59,
0x10, 0x5d, 0x68, 0x6d,
0x40, 0x5b, 0x4e, 0x7d,
0x02, 0x19, 0x32, 0x00,
0x80, 0xf9, 0xf2, 0x01,
0xff, 0xea, 0x10, 0x03,
0x08, 0xa8, 0x51, 0x03,
0x00, 0xe2, 0x02, 0x45,
0x80, 0xf9, 0x10, 0x6d,
0x00, 0xe2, 0x40, 0x45,
0x80, 0xf9, 0x4e, 0x6d,
0x01, 0x43, 0xc1, 0x31,
0x00, 0xfb, 0x10, 0x65,
0x00, 0xfb, 0x4e, 0x65,
0x01, 0x42, 0xc1, 0x31,
0x00, 0xfa, 0x10, 0x65,
0x00, 0xfa, 0x4e, 0x65,
0x01, 0xe8, 0xd4, 0x1d,
0x30, 0x3f, 0xc0, 0x09,
0x30, 0xe0, 0x10, 0x65,
0x40, 0x4b, 0x10, 0x6d,
0x30, 0xe0, 0x4e, 0x65,
0x40, 0x4b, 0x4e, 0x6d,
0xff, 0xea, 0x52, 0x01,
0xee, 0x00, 0x5c, 0x6d,
0xee, 0x00, 0x9a, 0x6d,
0x80, 0xf9, 0xf2, 0x01,
0x02, 0xea, 0xb4, 0x00,
0x20, 0xea, 0x9a, 0x00,
0xf3, 0x42, 0x66, 0x6d,
0x12, 0xea, 0x06, 0x59,
0xf3, 0x42, 0xa4, 0x6d,
0x12, 0xea, 0x3c, 0x59,
0x12, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x0d, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xdc, 0x41,
0x0d, 0xea, 0x3c, 0x59,
0x0d, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xa6, 0x41,
0x11, 0xea, 0x06, 0x59,
0x00, 0xe2, 0xdc, 0x41,
0x11, 0xea, 0x3c, 0x59,
0x11, 0xea, 0x04, 0x00,
0x00, 0xe2, 0xdc, 0x5a,
0x00, 0xe2, 0x12, 0x5b,
0x08, 0x5a, 0xb4, 0x00,
0x00, 0xe2, 0x8e, 0x5d,
0x00, 0xe2, 0xcc, 0x5d,
0xa8, 0xea, 0x32, 0x00,
0x00, 0xe2, 0xf4, 0x58,
0x80, 0x1a, 0x80, 0x7d,
0x00, 0xe2, 0x8e, 0x5d,
0x00, 0xe2, 0x2a, 0x59,
0x80, 0x1a, 0xbe, 0x7d,
0x00, 0xe2, 0xcc, 0x5d,
0x80, 0x19, 0x32, 0x00,
0x40, 0x5b, 0x86, 0x6d,
0x08, 0x5a, 0x86, 0x7d,
0x20, 0x4d, 0x10, 0x7d,
0x40, 0x5b, 0xc4, 0x6d,
0x08, 0x5a, 0xc4, 0x7d,
0x20, 0x4d, 0x4e, 0x7d,
0x02, 0x84, 0x09, 0x03,
0x40, 0x5b, 0x56, 0x7d,
0x08, 0xa8, 0xfb, 0x6c,
0x40, 0x5b, 0x94, 0x7d,
0x08, 0xa8, 0x39, 0x6d,
0x02, 0xea, 0xb4, 0x04,
0x01, 0x38, 0xe1, 0x30,
0x05, 0x39, 0xe3, 0x98,
......@@ -727,7 +758,7 @@ static uint8_t seqprog[] = {
0x04, 0xea, 0xe8, 0x30,
0xff, 0xea, 0xf0, 0x08,
0x02, 0xea, 0xf2, 0x00,
0xff, 0xea, 0xf4, 0x08
0xff, 0xea, 0xf4, 0x0c
};
typedef int ahd_patch_func_t (struct ahd_softc *ahd);
......@@ -911,102 +942,104 @@ static struct patch {
{ ahd_patch0_func, 51, 1, 1 },
{ ahd_patch2_func, 54, 1, 2 },
{ ahd_patch0_func, 55, 1, 1 },
{ ahd_patch2_func, 125, 6, 1 },
{ ahd_patch1_func, 131, 2, 1 },
{ ahd_patch3_func, 133, 1, 1 },
{ ahd_patch2_func, 142, 1, 2 },
{ ahd_patch0_func, 143, 1, 1 },
{ ahd_patch4_func, 144, 2, 2 },
{ ahd_patch0_func, 146, 6, 3 },
{ ahd_patch2_func, 149, 1, 2 },
{ ahd_patch0_func, 150, 1, 1 },
{ ahd_patch2_func, 153, 1, 2 },
{ ahd_patch0_func, 154, 1, 1 },
{ ahd_patch5_func, 156, 2, 1 },
{ ahd_patch3_func, 164, 16, 2 },
{ ahd_patch0_func, 180, 1, 1 },
{ ahd_patch6_func, 200, 2, 1 },
{ ahd_patch5_func, 204, 2, 1 },
{ ahd_patch1_func, 218, 1, 2 },
{ ahd_patch0_func, 219, 1, 1 },
{ ahd_patch1_func, 222, 1, 2 },
{ ahd_patch0_func, 223, 1, 1 },
{ ahd_patch2_func, 226, 1, 2 },
{ ahd_patch0_func, 227, 1, 1 },
{ ahd_patch1_func, 282, 1, 2 },
{ ahd_patch0_func, 283, 1, 1 },
{ ahd_patch2_func, 291, 1, 2 },
{ ahd_patch0_func, 292, 1, 1 },
{ ahd_patch2_func, 295, 1, 2 },
{ ahd_patch0_func, 296, 1, 1 },
{ ahd_patch1_func, 303, 1, 2 },
{ ahd_patch0_func, 304, 1, 1 },
{ ahd_patch7_func, 323, 1, 1 },
{ ahd_patch7_func, 326, 1, 1 },
{ ahd_patch7_func, 328, 1, 1 },
{ ahd_patch7_func, 340, 1, 1 },
{ ahd_patch1_func, 350, 1, 2 },
{ ahd_patch0_func, 351, 1, 1 },
{ ahd_patch1_func, 353, 1, 2 },
{ ahd_patch0_func, 354, 1, 1 },
{ ahd_patch1_func, 362, 1, 2 },
{ ahd_patch0_func, 363, 1, 1 },
{ ahd_patch2_func, 374, 1, 2 },
{ ahd_patch0_func, 375, 1, 1 },
{ ahd_patch8_func, 377, 1, 1 },
{ ahd_patch9_func, 404, 1, 1 },
{ ahd_patch1_func, 411, 1, 2 },
{ ahd_patch0_func, 412, 1, 1 },
{ ahd_patch2_func, 424, 1, 2 },
{ ahd_patch0_func, 425, 1, 1 },
{ ahd_patch10_func, 453, 1, 1 },
{ ahd_patch11_func, 462, 1, 2 },
{ ahd_patch0_func, 463, 1, 1 },
{ ahd_patch12_func, 468, 1, 1 },
{ ahd_patch11_func, 469, 1, 1 },
{ ahd_patch13_func, 482, 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_patch2_func, 152, 6, 1 },
{ ahd_patch1_func, 158, 2, 1 },
{ ahd_patch3_func, 160, 1, 1 },
{ ahd_patch2_func, 169, 1, 2 },
{ ahd_patch0_func, 170, 1, 1 },
{ ahd_patch4_func, 171, 2, 2 },
{ ahd_patch0_func, 173, 6, 3 },
{ ahd_patch2_func, 176, 1, 2 },
{ ahd_patch0_func, 177, 1, 1 },
{ ahd_patch2_func, 180, 1, 2 },
{ ahd_patch0_func, 181, 1, 1 },
{ ahd_patch5_func, 183, 2, 1 },
{ ahd_patch3_func, 191, 16, 2 },
{ ahd_patch0_func, 207, 1, 1 },
{ ahd_patch6_func, 227, 2, 1 },
{ ahd_patch5_func, 231, 2, 1 },
{ ahd_patch1_func, 245, 1, 2 },
{ ahd_patch0_func, 246, 1, 1 },
{ ahd_patch1_func, 249, 1, 2 },
{ ahd_patch0_func, 250, 1, 1 },
{ ahd_patch2_func, 253, 1, 2 },
{ ahd_patch0_func, 254, 1, 1 },
{ ahd_patch1_func, 309, 1, 2 },
{ ahd_patch0_func, 310, 1, 1 },
{ ahd_patch2_func, 318, 1, 2 },
{ ahd_patch0_func, 319, 1, 1 },
{ ahd_patch2_func, 322, 1, 2 },
{ ahd_patch0_func, 323, 1, 1 },
{ ahd_patch1_func, 330, 1, 2 },
{ ahd_patch0_func, 331, 1, 1 },
{ ahd_patch7_func, 350, 1, 1 },
{ ahd_patch7_func, 353, 1, 1 },
{ ahd_patch7_func, 355, 1, 1 },
{ ahd_patch7_func, 367, 1, 1 },
{ ahd_patch1_func, 377, 1, 2 },
{ ahd_patch0_func, 378, 1, 1 },
{ ahd_patch1_func, 380, 1, 2 },
{ ahd_patch0_func, 381, 1, 1 },
{ ahd_patch1_func, 389, 1, 2 },
{ ahd_patch0_func, 390, 1, 1 },
{ ahd_patch2_func, 401, 1, 2 },
{ ahd_patch0_func, 402, 1, 1 },
{ ahd_patch8_func, 404, 1, 1 },
{ ahd_patch9_func, 431, 1, 1 },
{ ahd_patch1_func, 438, 1, 2 },
{ ahd_patch0_func, 439, 1, 1 },
{ ahd_patch2_func, 451, 1, 2 },
{ ahd_patch0_func, 452, 1, 1 },
{ ahd_patch10_func, 480, 1, 1 },
{ ahd_patch11_func, 489, 1, 2 },
{ ahd_patch0_func, 490, 1, 1 },
{ ahd_patch12_func, 495, 1, 1 },
{ ahd_patch11_func, 496, 1, 1 },
{ ahd_patch13_func, 509, 1, 2 },
{ ahd_patch0_func, 510, 1, 1 },
{ ahd_patch2_func, 515, 1, 2 },
{ ahd_patch0_func, 516, 1, 1 },
{ ahd_patch2_func, 520, 1, 2 },
{ ahd_patch0_func, 521, 1, 1 },
{ ahd_patch1_func, 522, 1, 2 },
{ ahd_patch0_func, 523, 1, 1 },
{ ahd_patch2_func, 534, 1, 2 },
{ ahd_patch0_func, 535, 1, 1 },
{ ahd_patch14_func, 539, 1, 1 },
{ ahd_patch15_func, 544, 1, 1 },
{ ahd_patch16_func, 545, 2, 1 },
{ ahd_patch15_func, 549, 1, 2 },
{ ahd_patch1_func, 532, 1, 2 },
{ ahd_patch0_func, 533, 1, 1 },
{ ahd_patch1_func, 536, 1, 2 },
{ ahd_patch0_func, 537, 1, 1 },
{ ahd_patch2_func, 542, 1, 2 },
{ ahd_patch0_func, 543, 1, 1 },
{ ahd_patch2_func, 547, 1, 2 },
{ ahd_patch0_func, 548, 1, 1 },
{ ahd_patch1_func, 549, 1, 2 },
{ ahd_patch0_func, 550, 1, 1 },
{ ahd_patch2_func, 557, 1, 2 },
{ ahd_patch0_func, 558, 1, 1 },
{ ahd_patch1_func, 576, 1, 2 },
{ ahd_patch2_func, 561, 1, 2 },
{ ahd_patch0_func, 562, 1, 1 },
{ 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_patch1_func, 591, 1, 2 },
{ ahd_patch0_func, 592, 1, 1 },
{ ahd_patch14_func, 616, 1, 1 },
{ ahd_patch14_func, 632, 1, 1 },
{ ahd_patch2_func, 644, 1, 2 },
{ ahd_patch0_func, 645, 1, 1 },
{ ahd_patch1_func, 662, 1, 2 },
{ ahd_patch0_func, 663, 1, 1 },
{ ahd_patch14_func, 668, 1, 1 },
{ ahd_patch1_func, 688, 1, 2 },
{ ahd_patch0_func, 689, 1, 1 },
{ ahd_patch1_func, 691, 1, 2 },
{ ahd_patch0_func, 692, 1, 1 },
{ ahd_patch1_func, 694, 1, 2 },
{ ahd_patch0_func, 695, 1, 1 },
{ ahd_patch17_func, 697, 1, 2 },
{ ahd_patch0_func, 698, 2, 1 },
{ ahd_patch18_func, 701, 4, 2 },
{ ahd_patch0_func, 705, 1, 1 },
{ ahd_patch18_func, 711, 11, 1 }
{ ahd_patch2_func, 584, 1, 2 },
{ ahd_patch0_func, 585, 1, 1 },
{ ahd_patch2_func, 600, 1, 2 },
{ ahd_patch0_func, 601, 1, 1 },
{ ahd_patch1_func, 607, 1, 2 },
{ ahd_patch0_func, 608, 1, 1 },
{ ahd_patch1_func, 622, 1, 2 },
{ ahd_patch0_func, 623, 1, 1 },
{ ahd_patch14_func, 647, 1, 1 },
{ ahd_patch14_func, 663, 1, 1 },
{ ahd_patch2_func, 675, 1, 2 },
{ ahd_patch0_func, 676, 1, 1 },
{ ahd_patch1_func, 693, 1, 2 },
{ ahd_patch0_func, 694, 1, 1 },
{ ahd_patch14_func, 699, 1, 1 },
{ ahd_patch1_func, 719, 1, 2 },
{ ahd_patch0_func, 720, 1, 1 },
{ ahd_patch1_func, 722, 1, 2 },
{ ahd_patch0_func, 723, 1, 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 {
......@@ -1017,17 +1050,17 @@ static struct cs {
{ 13, 14 },
{ 24, 32 },
{ 33, 46 },
{ 56, 59 },
{ 68, 90 },
{ 91, 119 },
{ 121, 125 },
{ 133, 141 },
{ 164, 197 },
{ 616, 632 },
{ 632, 650 },
{ 655, 661 },
{ 668, 673 },
{ 673, 679 }
{ 59, 62 },
{ 89, 114 },
{ 115, 146 },
{ 148, 152 },
{ 160, 168 },
{ 191, 224 },
{ 647, 663 },
{ 663, 681 },
{ 686, 692 },
{ 699, 704 },
{ 704, 710 }
};
static const int num_critical_sections = sizeof(critical_sections)
......
......@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#103 $
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#104 $
*
* $FreeBSD$
*/
......@@ -1848,7 +1848,6 @@ ahc_update_neg_request(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
tinfo->curr.period = AHC_PERIOD_UNKNOWN;
tinfo->curr.width = AHC_WIDTH_UNKNOWN;
tinfo->curr.offset = AHC_OFFSET_UNKNOWN;
tinfo->curr.ppr_options = AHC_OFFSET_UNKNOWN;
}
if (tinfo->curr.period != tinfo->goal.period
|| tinfo->curr.width != tinfo->goal.width
......
/*
* 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
* The University of Calgary Department of Computer Science.
......@@ -812,9 +812,10 @@ static int ahc_linux_release(struct Scsi_Host *);
static int ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
static const char *ahc_linux_info(struct Scsi_Host *);
#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 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*,
sector_t, int[]);
#else
......@@ -874,15 +875,6 @@ ahc_linux_detect(Scsi_Host_Template *template)
template->proc_dir = &proc_scsi_aic7xxx;
#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
* probing for any adapters.
......@@ -1029,9 +1021,11 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
static int
ahc_linux_slave_alloc(Scsi_Device *device)
{
/*
* Nothing to be done for now.
*/
struct ahc_softc *ahc;
ahc = *((struct ahc_softc **)device->host->hostdata);
if (bootverbose)
printf("%s: Slave Alloc %d\n", ahc_name(ahc), device->id);
return (0);
}
......@@ -1043,6 +1037,8 @@ ahc_linux_slave_configure(Scsi_Device *device)
u_long flags;
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);
/*
* Since Linux has attached to the device, configure
......@@ -1055,8 +1051,8 @@ ahc_linux_slave_configure(Scsi_Device *device)
if (dev != NULL) {
dev->flags &= ~AHC_DEV_UNCONFIGURED;
dev->scsi_device = device;
}
ahc_linux_device_queue_depth(ahc, dev);
}
ahc_midlayer_entrypoint_unlock(ahc, &flags);
return (0);
}
......@@ -1069,12 +1065,26 @@ ahc_linux_slave_destroy(Scsi_Device *device)
u_long flags;
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);
dev = ahc_linux_get_device(ahc, device->channel,
device->id, device->lun,
/*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;
if (TAILQ_EMPTY(&dev->busyq)
&& dev->active == 0)
ahc_linux_free_device(ahc, dev);
}
ahc_midlayer_entrypoint_unlock(ahc, &flags);
}
#else
......@@ -1135,10 +1145,15 @@ static int
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev,
sector_t capacity, int geom[])
{
uint8_t *bh;
#else
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 sectors;
int cylinders;
......@@ -1146,23 +1161,9 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
int extended;
struct ahc_softc *ahc;
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);
#else
ahc = *((struct ahc_softc **)disk->device->host->hostdata);
#endif
channel = sdev->channel;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
bh = scsi_bios_ptable(bdev);
......@@ -1185,7 +1186,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
}
heads = 64;
sectors = 32;
cylinders = capacity / (heads * sectors);
cylinders = aic_sector_div(capacity, heads, sectors);
if (aic7xxx_extended != 0)
extended = 1;
......@@ -1196,7 +1197,7 @@ ahc_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
if (extended && cylinders >= 1024) {
heads = 255;
sectors = 63;
cylinders = capacity / (heads * sectors);
cylinders = aic_sector_div(capacity, heads, sectors);
}
geom[0] = heads;
geom[1] = sectors;
......@@ -1288,6 +1289,14 @@ Scsi_Host_Template aic7xxx_driver_template = {
.sg_tablesize = AHC_NSEG,
.cmd_per_lun = 2,
.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 LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
/* Assume RedHat Distribution with its different HIGHIO conventions. */
......@@ -1298,6 +1307,8 @@ Scsi_Host_Template aic7xxx_driver_template = {
#endif
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
.name = "aic7xxx",
.slave_alloc = ahc_linux_slave_alloc,
.slave_configure = ahc_linux_slave_configure,
.slave_destroy = ahc_linux_slave_destroy,
#else
......
......@@ -53,7 +53,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* 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_
......@@ -300,7 +300,7 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec)
#include <linux/smp.h>
#endif
#define AIC7XXX_DRIVER_VERSION "6.2.23"
#define AIC7XXX_DRIVER_VERSION "6.2.24"
/**************************** Front End Queues ********************************/
/*
......@@ -347,7 +347,8 @@ typedef enum {
AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
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;
struct ahc_linux_target;
......
......@@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#27 $
* $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#28 $
*
* $FreeBSD$
*/
......@@ -707,7 +707,7 @@ expression:
;
constant:
T_CONST T_SYMBOL numerical_value
T_CONST T_SYMBOL expression
{
if ($2->type != UNINITIALIZED) {
stop("Re-definition of symbol as a constant",
......@@ -716,7 +716,7 @@ constant:
}
$2->type = CONST;
initialize_symbol($2);
$2->info.cinfo->value = $3;
$2->info.cinfo->value = $3.value;
}
| 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