2005-01-06 01:43:34 +00:00
|
|
|
/*-
|
2002-06-05 19:52:45 +00:00
|
|
|
* Aic79xx register and scratch ram definitions.
|
|
|
|
*
|
Correct a very rare case where command ordering could be compromised
by a transaction performing a driver handled message sequence (an
scb with the MK_MESSAGE flag set).
SCBs that perform host managed messaging must always be
at the head of their per-target selection queue so that
the firmware knows to manually assert ATN if the current
negotiation agreement is packetized. In the past we
guaranteed this by queuing these SCBs separarately in
the execution queue. This exposes the system to potential
command reordering in two cases:
1) Another SCB for the same ITL nexus is queued that does
not have the MK_MESSAGE flag set. This SCB will be
queued to the per-target list which can be serviced
before the MK_MESSAGE scb that preceeded it.
2) If the target cannot accept all of the commands in the
per-target selection queue in one selection, the remainder
is queued to the tail of the selection queues so as to
effect round-robin scheduling. This could allow the
MK_MESSAGE scb to be sent to the target before the
requeued commands.
This commit changes the firmware policy to defer queuing
MK_MESSAGE SCBs into the selection queues until this can
be done without affecting order. This means that the
target's selection queue is either empty, or the last
SCB on the execution queue is also a MK_MESSAGE SCB.
During any wait, the firmware halts the download of new
SCBs so only a single "holding location" is required.
Luckily, MK_MESSAGE SCBs are rare and typically occur only
during CAM's bus probe where only one command is outstanding
at a time. However, during some recovery scenarios, the
reordering *could* occur.
aic79xx.c:
Update ahd_search_qinfifo() and helper routines to
search for pending MK_MESSAGE scbs and properly
restitch the execution queue if either the MK_MESSAGE
SCB is being aborted, or the MK_MESSAGE SCB can be
queued due to the execution queue draining due to
aborts.
Enable LQOBUSFREE status to assert an interrupt.
This should be redundant since a BUSFREE interrupt
should always occur along with an LQOBUSFREE event,
but on the Rev A, this doesn't seem to be guaranteed.
When a PPR request is rejected when a previously
existing packetized agreement is in place, assume
that the target has been reset without our knowledge
and revert to async/narrow transfers. This corrects
two issues: the stale ENATNO setting that was used
to send the PPR is cleared so the firmware is not
confused by a future packetized selection with
ATN asserted but no MK_MESSAGE flag in the SCB and
it speeds up recovery by aborting any pending
packetized transactions that by definition are now
dead.
When re-queueing SCBs after a failed negotiation
attempt, ensure command ordering by freezing the
device queue first.
Traverse the list of pending SCBs rather than the
whole SCB array on the controller when pushing
MK_MESSAGE flag changes out to the controller.
The original code was optimized for the aic7xxx
controllers where there are fewer controller slots
then pending SCBs and the firmware picks SCB
slots. For the U320 controller, the hope is
that we have fewer pending SCBs then the 512
slots on the controller.
Enhance some diagnostics.
Factor out some common code.
aic79xx.h:
Add prototype for new ahd_done_with_status() that is
used to factor out some commone code.
aic79xx.reg:
Add definisions for the pending MK_MESSAGE SCB.
aic79xx.seq:
Defer MK_MESSAGE SCB queing to the execution queue
so as to preserve command ordering. Re-arrange some
of the selection processing code so the above change
had no performance impact on the common code path.
Close a few critical section holes.
When entering a non-packetized phase, manually enable
busfree interrupts, since the controller hardware
does not do this automatically.
aic79xx_inline.h:
Enhance logging for queued SCBs.
aic79xx_osm.c:
Add new a new DDB ahd command, ahd_dump, which
invokes the ahd_dump_card_state() routine on the
unit specified with the ahd_sunit DDB command.
aic79xx_pci.c:
Turn on the BUSFREEREV bug for the Rev B. controller.
This is required to close the busfree during non-packetized
phase hole.
2004-08-04 17:55:34 +00:00
|
|
|
* Copyright (c) 1994-2001, 2004 Justin T. Gibbs.
|
2002-08-31 06:49:11 +00:00
|
|
|
* Copyright (c) 2000-2002 Adaptec Inc.
|
2002-06-05 19:52:45 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions, and the following disclaimer,
|
|
|
|
* without modification.
|
|
|
|
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
|
|
|
* substantially similar to the "NO WARRANTY" disclaimer below
|
|
|
|
* ("Disclaimer") and any redistribution must be conditioned upon
|
|
|
|
* including a substantially similar Disclaimer requirement for further
|
|
|
|
* binary redistribution.
|
|
|
|
* 3. Neither the names of the above-listed copyright holders nor the names
|
|
|
|
* of any contributors may be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* Alternatively, this software may be distributed under the terms of the
|
|
|
|
* GNU General Public License ("GPL") version 2 as published by the Free
|
|
|
|
* Software Foundation.
|
|
|
|
*
|
|
|
|
* NO WARRANTY
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
|
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGES.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
aic79xx.c:
Allow 500us between pauses in ahd_pause_and_flushwork().
The maximum we will wait is now 500ms.
In the same routine, remove any attempt to clear ENSELO.
Let the firmware do it once the current selection has
completed. This avoids some race conditions having to
do with non-packetized completions and the auto-clearing
of ENSELO on packetized completions.
Also avoid attempts to clear critical sections when
interrups are pending. We are going to loop again
anyway, so clearing critical sections is a waste of
time. It also may not be possible to clear a critical
section if the source of the interrupt was a SEQINT.
aic79xx_pci.c:
Use the Generic 9005 mask when looking for generic 7901B
parts. This allows the driver to attach to 7901B parts
on motherboards using a non-Adaptec subvendor ID.
aic79xx_inline.h:
Test for the SCBRAM_RD_BUG against the bugs
field, not the flags field in the softc.
aic79xx.c:
Cancel pending transactions on devices that
respond with a selection timeout. This decreases
the duration of timeout recovery when a device
disappears.
aic79xx.c:
Don't bother forcing renegotiation on a selection
timeout now that we use the device reset handler
to abort any pending commands on the target.
The device reset handler already takes us down
to async narrow and forces a renegotiation.
In the device reset handlers, only send a
BDR sent async event if the status is not
CAM_SEL_TIMEOUT. This avoids sending this
event in the selection timeout case
aic79xx.c:
Modify the Core timeout handler to verify that another
command has the potential to timeout before passing off
a command timeout as due to some other command. This
safety measure is added in response to a timeout recovery
failure on H2B where it appears that incoming reselection
status was lost during a drive pull test. In that case,
the recovery handler continued to wait for the command
that was active on the bus indefinetly. While the root
cause of the above issue is still being determined seems
a prudent safeguard.
aic79xx_pci.c:
Add a specific probe entry for the Dell OEM 39320(B).
aic79xx.c:
aic79xx.h:
aic79xx.reg:
aic79xx.seq:
Modify the aic79xx firmware to never cross a cacheline or
ADB boundary when DMA'ing completion entries to the host.
In PCI mode, at least in 32/33 configurations, the SCB
DMA engine may lose its place in the data-stream should
the target force a retry on something other than an
8byte aligned boundary. In PCI-X mode, we do this to
avoid split transactions since many chipsets seem to be
unable to format proper split completions to continue
the data transfer.
The above change allows us to drop our completion entries
from 8 bytes to 4. We were using 8 byte entries to ensure
that PCI retries could only occur on an 8byte aligned
boundary. Now that the sequencer guarantees this by splitting
up completions, we can safely drop the size to 4 bytes (2
byte tag, one byte SG_RESID, one byte pad).
Both the split-completion and PCI retry problems only show
up under high tag load when interrupt coalescing is being
especially effective. The switch from a 2byte completion
entry to an 8 byte entry to solve the PCI problem increased
the chance of incurring a split in PCI-X mode when multiple
transactions were completed at once. Dropping the completion
size to 4 bytes also means that we can complete more commands
in a single DMA (128byte FIFO -> 32 commands instead of 16).
aic79xx.c:
Modify the SCSIINT handler to defer clearing
sequencer critical sections to the individual
interrupt handlers. This allows us to
immediately disable any outgoing selections in
the case of an unexpected busfree so we don't
inadvertantly clear ENSELO *after* a new selection
has started. Doing so may cause the sequencer
to miss a successful selection.
In ahd_update_pending_scbs(), only clear ENSELO if
the bus is currently busy and a selection is not
already in progress or the sequencer has yet to
handle a pending selection. While we want to ensure
that the selection for the SCB at the head of the
selection queue is restarted so that any change in
negotiation request can take effect, we can't clobber
pending selection state without confusing the sequencer
into missing a selection.
2004-05-11 20:46:05 +00:00
|
|
|
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $"
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is processed by the aic7xxx_asm utility for use in assembling
|
|
|
|
* firmware for the aic79xx family of SCSI host adapters as well as to generate
|
|
|
|
* a C header file for use in the kernel portion of the Aic79xx driver.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Register window Modes */
|
|
|
|
#define M_DFF0 0
|
|
|
|
#define M_DFF1 1
|
|
|
|
#define M_CCHAN 2
|
|
|
|
#define M_SCSI 3
|
|
|
|
#define M_CFG 4
|
|
|
|
#define M_DST_SHIFT 4
|
|
|
|
|
|
|
|
#define MK_MODE(src, dst) ((src) | ((dst) << M_DST_SHIFT))
|
2002-09-26 22:54:00 +00:00
|
|
|
#define SET_MODE(src, dst) \
|
|
|
|
SET_SRC_MODE src; \
|
|
|
|
SET_DST_MODE dst; \
|
|
|
|
if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \
|
|
|
|
mvi MK_MODE(src, dst) call set_mode_work_around; \
|
|
|
|
} else { \
|
|
|
|
mvi MODE_PTR, MK_MODE(src, dst); \
|
|
|
|
}
|
|
|
|
|
2002-12-01 08:13:37 +00:00
|
|
|
#define RESTORE_MODE(mode) \
|
|
|
|
if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \
|
|
|
|
mov mode call set_mode_work_around; \
|
|
|
|
} else { \
|
|
|
|
mov MODE_PTR, mode; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SET_SEQINTCODE(code) \
|
|
|
|
if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) { \
|
|
|
|
mvi code call set_seqint_work_around; \
|
|
|
|
} else { \
|
|
|
|
mvi SEQINTCODE, code; \
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Mode Pointer
|
|
|
|
* Controls which of the 5, 512byte, address spaces should be used
|
|
|
|
* as the source and destination of any register accesses in our
|
|
|
|
* register window.
|
|
|
|
*/
|
|
|
|
register MODE_PTR {
|
|
|
|
address 0x000
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field DST_MODE 0x70
|
|
|
|
field SRC_MODE 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
mode_pointer
|
|
|
|
}
|
|
|
|
|
|
|
|
const SRC_MODE_SHIFT 0
|
|
|
|
const DST_MODE_SHIFT 4
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Interrupt Status
|
|
|
|
*/
|
|
|
|
register INTSTAT {
|
|
|
|
address 0x001
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field HWERRINT 0x80
|
|
|
|
field BRKADRINT 0x40
|
|
|
|
field SWTMINT 0x20
|
|
|
|
field PCIINT 0x10
|
|
|
|
field SCSIINT 0x08
|
|
|
|
field SEQINT 0x04
|
|
|
|
field CMDCMPLT 0x02
|
|
|
|
field SPLTINT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
mask INT_PEND 0xFF
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Interrupt Code
|
|
|
|
*/
|
|
|
|
register SEQINTCODE {
|
|
|
|
address 0x002
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field {
|
2002-12-01 08:13:37 +00:00
|
|
|
NO_SEQINT, /* No seqint pending. */
|
|
|
|
BAD_PHASE, /* unknown scsi bus phase */
|
2002-08-31 06:49:11 +00:00
|
|
|
SEND_REJECT, /* sending a message reject */
|
|
|
|
PROTO_VIOLATION, /* Protocol Violation */
|
|
|
|
NO_MATCH, /* no cmd match for reconnect */
|
|
|
|
IGN_WIDE_RES, /* Complex IGN Wide Res Msg */
|
|
|
|
PDATA_REINIT, /*
|
2002-06-05 19:52:45 +00:00
|
|
|
* Returned to data phase
|
|
|
|
* that requires data
|
|
|
|
* transfer pointers to be
|
|
|
|
* recalculated from the
|
|
|
|
* transfer residual.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
HOST_MSG_LOOP, /*
|
2002-06-05 19:52:45 +00:00
|
|
|
* The bus is ready for the
|
|
|
|
* host to perform another
|
|
|
|
* message transaction. This
|
|
|
|
* mechanism is used for things
|
|
|
|
* like sync/wide negotiation
|
|
|
|
* that require a kernel based
|
|
|
|
* message state engine.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
BAD_STATUS, /* Bad status from target */
|
|
|
|
DATA_OVERRUN, /*
|
2002-06-05 19:52:45 +00:00
|
|
|
* Target attempted to write
|
|
|
|
* beyond the bounds of its
|
|
|
|
* command.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
MKMSG_FAILED, /*
|
2002-06-05 19:52:45 +00:00
|
|
|
* Target completed command
|
|
|
|
* without honoring our ATN
|
|
|
|
* request to issue a message.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
MISSED_BUSFREE, /*
|
2002-06-05 19:52:45 +00:00
|
|
|
* The sequencer never saw
|
|
|
|
* the bus go free after
|
|
|
|
* either a command complete
|
|
|
|
* or disconnect message.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
DUMP_CARD_STATE,
|
|
|
|
ILLEGAL_PHASE,
|
|
|
|
INVALID_SEQINT,
|
|
|
|
CFG4ISTAT_INTR,
|
|
|
|
STATUS_OVERRUN,
|
|
|
|
CFG4OVERRUN,
|
2002-12-01 08:13:37 +00:00
|
|
|
ENTERING_NONPACK,
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
TASKMGMT_FUNC_COMPLETE, /*
|
|
|
|
* Task management function
|
|
|
|
* request completed with
|
|
|
|
* an expected busfree.
|
|
|
|
*/
|
|
|
|
TASKMGMT_CMD_CMPLT_OKAY, /*
|
|
|
|
* A command with a non-zero
|
|
|
|
* task management function
|
|
|
|
* has completed via the normal
|
|
|
|
* command completion method
|
|
|
|
* for commands with a zero
|
|
|
|
* task management function.
|
|
|
|
* This happens when an attempt
|
|
|
|
* to abort a command loses
|
|
|
|
* the race for the command to
|
|
|
|
* complete normally.
|
|
|
|
*/
|
2002-12-01 08:13:37 +00:00
|
|
|
TRACEPOINT0,
|
|
|
|
TRACEPOINT1,
|
|
|
|
TRACEPOINT2,
|
|
|
|
TRACEPOINT3,
|
Correct spelling errors.
Switch to handling bad SCSI status as a sequencer interrupt
instead of having the kernel proccess these failures via
the completion queue. This is done because:
o The old scheme required us to pause the sequencer and clear
critical sections for each SCB. It seems that these pause
actions, if coincident with a sequencer FIFO interrupt, would
result in a FIFO interrupt getting lost or directing to the
wrong FIFO. This caused hangs when the driver was stressed
under high "queue full" loads.
o The completion code assumed that it was always called with
the sequencer running. This may not be the case in timeout
processing where completions occur manually via
ahd_pause_and_flushwork().
o With this scheme, the extra expense of clearing critical
sections is avoided since the sequencer will only self pause
once all pending selections have cleared and it is not in
a critical section.
aic79xx.c
Add code to handle the new BAD_SCB_STATUS sequencer
interrupt code. This just redirects the SCB through
the already existing ahd_complete_scb() code path.
Remove code in ahd_handle_scsi_status() that paused
the sequencer, made sure that no selections where
pending, and cleared critical sections. Bad
status SCBs are now only processed when all of these
conditions are true.
aic79xx.reg:
Add the BAD_SCB_STATUS sequencer interrupt code.
aic79xx.seq:
When completing an SCB upload to the host, if
we are doing this because the SCB contains non-zero
SCSI status, defer completing the SCB until there
are no pending selection events. When completing
these SCBs, use the new BAD_SCB_STATUS sequencer
interrupt. For all other uploaded SCBs (currently
only for underruns), the SCB is completed via the
normal done queue. Additionally, keep the SCB that
is currently being uploaded on the COMPLETE_DMA_SCB
list until the dma is completed, not just until the
DMA is started. This ensures that the DMA is restarted
properly should the host disable the DMA transfer for
some reason.
In our RevA workaround for Maxtor drives, guard against
the host pausing us while trying to pause I/O until the
first data-valid REQ by clearing the current snapshot
so that we can tell if the transfer has completed prior
to us noticing the REQINIT status.
In cfg4data_intr, shave off an instruction before getting
the data path running by adding an entrypoint to the
overrun handler to also increment the FIFO use count.
In the overrun handler, be sure to clear our LONGJMP
address in both exit paths.
Perform a few sequencer optimizations.
aic79xx.c:
Print the full path from the SCB when a packetized
status overrun occurs.
Remove references to LONGJMP_SCB which is being
removed from firmware usage.
Print the new SCB_FIFO_USE_COUNT field in the
per-SCB section of ahd_dump_card_state(). The
SCB_TAG field is now re-used by the sequencer,
so it no longer makes sense to reference this
field in the kernel driver.
aic79xx.h:
Re-arrange fields in the hardware SCB from largest
size type to smallest. This makes it easier to
move fields without changing field alignment.
The hardware scb tag field is now down near the
"spare" portion of the SCB to facilitate reuse
by the sequencer.
aic79xx.reg:
Remove LONGJMP_ADDR.
Rearrange SCB fields to match aic79xx.h.
Add SCB_FIFO_USE_COUNT as the first byte
of the SCB_TAG field.
aic79xx.seq:
Add a per-SCB "Fifos in use count" field and use
it to determine when it is safe (all data posted)
to deliver status back to the host. The old method
involved polling one or both FIFOs to verify that
the current task did not have pending data. This
makes running down the GSFIFO very cheap, so we
will empty the GSFIFO in one idle loop pass in
all cases.
Use this simplification of the completion process
to prune down the data FIFO teardown sequencer for
packetized transfers. Much more code is now shared
between the data residual and transfer complete cases.
Correct some issues in the packetized status handler.
It used to be possible to CLRCHN our FIFO before status
had fully transferred to the host. We also failed to
handle NONPACKREQ phases that could occur should a CRC
error occur during transmission of the status data packet.
Correct a few big endian issues:
aic79xx.c:
aic79xx_inline.h:
aic79xx_pci.c:
aic79xx_osm.c:
o Always get the SCB's tag via the SCB_GET_TAG acccessor
o Add missing use of byte swapping macros when touching
hscb fields.
o Don't double swap SEEPROM data when it is printed.
Correct a big-endian bug. We cannot assign a
o When assigning a 32bit LE variable to a 64bit LE
variable, we must be explict about how the words
of the 64bit LE variable are initialized. Cast to
(uint32_t*) to do this.
aic79xx.c:
In ahd_clear_critical_section(), hit CRLSCSIINT
after restoring the interrupt masks to avoid what
appears to be a glitch on SCSIINT. Any real SCSIINT
status will be persistent and will immidiately
reset SCSIINT. This clear should only get rid of
spurious SCSIINTs.
This glitch was the cause of the "Unexpected PKT busfree"
status that occurred under high queue full loads
Call ahd_fini_scbdata() after shutdown so that
any ahd_chip_init() routine that might access
SCB data will not access free'd memory.
Reset the bus on an IOERR since the chip doesn't
seem to reset to the new voltage level without
this.
Change offset calculation for scatter gather maps
so that the calculation is correct if an integral
multiple of sg lists does not fit in the allocation
size.
Adjust bus dma tag for data buffers based on 39BIT
addressing flag in our softc.
Use the QFREEZE count to simplify ahd_pause_and_flushworkd().
We can thus rely on the sequencer eventually clearing ENSELO.
In ahd_abort_scbs(), fix a bug that could potentially
corrupt sequencer state. The saved SCB was being
restored in the SCSI mode instead of the saved mode.
It turns out that the SCB did not need to be saved at all
as the scbptr is already restored by all subroutines
called during this function that modify that register.
aic79xx.c:
aic79xx.h:
aic79xx_pci.c:
Add support for parsing the seeprom vital product
data. The VPD data are currently unused.
aic79xx.h:
aic79xx.seq:
aic79xx_pci.c:
Add a firmware workaround to make the LED blink
brighter during packetized operations on the H2A.
aic79xx_inline.h:
The host does not use timer interrupts, so don't
gate our decision on whether or not to unpause
the sequencer on whether or not a timer interrupt
is pending.
2003-05-04 00:20:07 +00:00
|
|
|
SAW_HWERR,
|
|
|
|
BAD_SCB_STATUS
|
2002-08-31 06:49:11 +00:00
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear Host Interrupt
|
|
|
|
*/
|
|
|
|
register CLRINT {
|
|
|
|
address 0x003
|
|
|
|
access_mode WO
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRHWERRINT 0x80 /* Rev B or greater */
|
|
|
|
field CLRBRKADRINT 0x40
|
|
|
|
field CLRSWTMINT 0x20
|
2002-12-04 22:51:29 +00:00
|
|
|
field CLRPCIINT 0x10
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRSCSIINT 0x08
|
|
|
|
field CLRSEQINT 0x04
|
|
|
|
field CLRCMDINT 0x02
|
|
|
|
field CLRSPLTINT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Error Register
|
|
|
|
*/
|
|
|
|
register ERROR {
|
|
|
|
address 0x004
|
|
|
|
access_mode RO
|
2002-08-31 06:49:11 +00:00
|
|
|
field CIOPARERR 0x80
|
|
|
|
field CIOACCESFAIL 0x40 /* Rev B or greater */
|
|
|
|
field MPARERR 0x20
|
|
|
|
field DPARERR 0x10
|
|
|
|
field SQPARERR 0x08
|
|
|
|
field ILLOPCODE 0x04
|
|
|
|
field DSCTMOUT 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear Error
|
|
|
|
*/
|
|
|
|
register CLRERR {
|
|
|
|
address 0x004
|
|
|
|
access_mode WO
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRCIOPARERR 0x80
|
|
|
|
field CLRCIOACCESFAIL 0x40 /* Rev B or greater */
|
|
|
|
field CLRMPARERR 0x20
|
|
|
|
field CLRDPARERR 0x10
|
|
|
|
field CLRSQPARERR 0x08
|
|
|
|
field CLRILLOPCODE 0x04
|
|
|
|
field CLRDSCTMOUT 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Control Register
|
|
|
|
* Overall host control of the device.
|
|
|
|
*/
|
|
|
|
register HCNTRL {
|
|
|
|
address 0x005
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field SEQ_RESET 0x80 /* Rev B or greater */
|
|
|
|
field POWRDN 0x40
|
|
|
|
field SWINT 0x10
|
|
|
|
field SWTIMER_START_B 0x08 /* Rev B or greater */
|
|
|
|
field PAUSE 0x04
|
|
|
|
field INTEN 0x02
|
|
|
|
field CHIPRST 0x01
|
|
|
|
field CHIPRSTACK 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host New SCB Queue Offset
|
|
|
|
*/
|
|
|
|
register HNSCB_QOFF {
|
|
|
|
address 0x006
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Empty SCB Queue Offset
|
|
|
|
*/
|
|
|
|
register HESCB_QOFF {
|
|
|
|
address 0x008
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Mailbox
|
|
|
|
*/
|
|
|
|
register HS_MAILBOX {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
address 0x00B
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode RW
|
|
|
|
mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
|
2003-05-26 21:10:58 +00:00
|
|
|
mask ENINT_COALESCE 0x40 /* Perform interrupt coalescing */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Interupt Status
|
|
|
|
*/
|
|
|
|
register SEQINTSTAT {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
address 0x00C
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode RO
|
2002-08-31 06:49:11 +00:00
|
|
|
field SEQ_SWTMRTO 0x10
|
|
|
|
field SEQ_SEQINT 0x08
|
|
|
|
field SEQ_SCSIINT 0x04
|
|
|
|
field SEQ_PCIINT 0x02
|
|
|
|
field SEQ_SPLTINT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear SEQ Interrupt
|
|
|
|
*/
|
|
|
|
register CLRSEQINTSTAT {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
address 0x00C
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode WO
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRSEQ_SWTMRTO 0x10
|
|
|
|
field CLRSEQ_SEQINT 0x08
|
|
|
|
field CLRSEQ_SCSIINT 0x04
|
|
|
|
field CLRSEQ_PCIINT 0x02
|
|
|
|
field CLRSEQ_SPLTINT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Software Timer
|
|
|
|
*/
|
|
|
|
register SWTIMER {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
address 0x00E
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SEQ New SCB Queue Offset
|
|
|
|
*/
|
|
|
|
register SNSCB_QOFF {
|
|
|
|
address 0x010
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SEQ Empty SCB Queue Offset
|
|
|
|
*/
|
|
|
|
register SESCB_QOFF {
|
|
|
|
address 0x012
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SEQ Done SCB Queue Offset
|
|
|
|
*/
|
|
|
|
register SDSCB_QOFF {
|
|
|
|
address 0x014
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Queue Offset Control & Status
|
|
|
|
*/
|
|
|
|
register QOFF_CTLSTA {
|
|
|
|
address 0x016
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field EMPTY_SCB_AVAIL 0x80
|
|
|
|
field NEW_SCB_AVAIL 0x40
|
|
|
|
field SDSCB_ROLLOVR 0x20
|
|
|
|
field HS_MAILBOX_ACT 0x10
|
|
|
|
field SCB_QSIZE 0x0F {
|
|
|
|
SCB_QSIZE_4,
|
|
|
|
SCB_QSIZE_8,
|
|
|
|
SCB_QSIZE_16,
|
|
|
|
SCB_QSIZE_32,
|
|
|
|
SCB_QSIZE_64,
|
|
|
|
SCB_QSIZE_128,
|
|
|
|
SCB_QSIZE_256,
|
|
|
|
SCB_QSIZE_512,
|
|
|
|
SCB_QSIZE_1024,
|
|
|
|
SCB_QSIZE_2048,
|
|
|
|
SCB_QSIZE_4096,
|
|
|
|
SCB_QSIZE_8192,
|
|
|
|
SCB_QSIZE_16384
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Interrupt Control
|
|
|
|
*/
|
|
|
|
register INTCTL {
|
|
|
|
address 0x018
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field SWTMINTMASK 0x80
|
|
|
|
field SWTMINTEN 0x40
|
|
|
|
field SWTIMER_START 0x20
|
|
|
|
field AUTOCLRCMDINT 0x10
|
|
|
|
field PCIINTEN 0x08
|
|
|
|
field SCSIINTEN 0x04
|
|
|
|
field SEQINTEN 0x02
|
|
|
|
field SPLTINTEN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Control
|
|
|
|
*/
|
|
|
|
register DFCNTRL {
|
|
|
|
address 0x019
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field PRELOADEN 0x80
|
2002-12-01 08:13:37 +00:00
|
|
|
field SCSIENWRDIS 0x40 /* Rev B only. */
|
2002-08-31 06:49:11 +00:00
|
|
|
field SCSIEN 0x20
|
|
|
|
field SCSIENACK 0x20
|
|
|
|
field HDMAEN 0x08
|
|
|
|
field HDMAENACK 0x08
|
|
|
|
field DIRECTION 0x04
|
|
|
|
field DIRECTIONACK 0x04
|
|
|
|
field FIFOFLUSH 0x02
|
|
|
|
field FIFOFLUSHACK 0x02
|
|
|
|
field DIRECTIONEN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Device Space Command 0
|
|
|
|
*/
|
|
|
|
register DSCOMMAND0 {
|
|
|
|
address 0x019
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field CACHETHEN 0x80 /* Cache Threshold enable */
|
|
|
|
field DPARCKEN 0x40 /* Data Parity Check Enable */
|
|
|
|
field MPARCKEN 0x20 /* Memory Parity Check Enable */
|
|
|
|
field EXTREQLCK 0x10 /* External Request Lock */
|
|
|
|
field DISABLE_TWATE 0x02 /* Rev B or greater */
|
|
|
|
field CIOPARCKEN 0x01 /* Internal bus parity error enable */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Status
|
|
|
|
*/
|
|
|
|
register DFSTATUS {
|
|
|
|
address 0x01A
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field PRELOAD_AVAIL 0x80
|
|
|
|
field PKT_PRELOAD_AVAIL 0x40
|
|
|
|
field MREQPEND 0x10
|
|
|
|
field HDONE 0x08
|
|
|
|
field DFTHRESH 0x04
|
|
|
|
field FIFOFULL 0x02
|
|
|
|
field FIFOEMP 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Cache Pointer
|
|
|
|
*/
|
|
|
|
register SG_CACHE_PRE {
|
|
|
|
address 0x01B
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_ADDR_MASK 0xf8
|
|
|
|
field ODD_SEG 0x04
|
|
|
|
field LAST_SEG 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
register SG_CACHE_SHADOW {
|
|
|
|
address 0x01B
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_ADDR_MASK 0xf8
|
|
|
|
field ODD_SEG 0x04
|
|
|
|
field LAST_SEG 0x02
|
|
|
|
field LAST_SEG_DONE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Arbiter Control
|
|
|
|
*/
|
|
|
|
register ARBCTL {
|
|
|
|
address 0x01B
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field RESET_HARB 0x80
|
|
|
|
field RETRY_SWEN 0x08
|
|
|
|
field USE_TIME 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Host Address
|
|
|
|
*/
|
|
|
|
register HADDR {
|
|
|
|
address 0x070
|
|
|
|
access_mode RW
|
|
|
|
size 8
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Overlay DMA Address
|
|
|
|
*/
|
|
|
|
register HODMAADR {
|
|
|
|
address 0x070
|
|
|
|
access_mode RW
|
|
|
|
size 8
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
2002-12-01 08:13:37 +00:00
|
|
|
/*
|
|
|
|
* PCI PLL Delay.
|
|
|
|
*/
|
|
|
|
register PLLDELAY {
|
|
|
|
address 0x070
|
|
|
|
access_mode RW
|
|
|
|
size 1
|
|
|
|
modes M_CFG
|
|
|
|
field SPLIT_DROP_REQ 0x80
|
|
|
|
}
|
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Data Channel Host Count
|
|
|
|
*/
|
|
|
|
register HCNT {
|
|
|
|
address 0x078
|
|
|
|
access_mode RW
|
|
|
|
size 3
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Overlay DMA Count
|
|
|
|
*/
|
|
|
|
register HODMACNT {
|
|
|
|
address 0x078
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Host Overlay DMA Enable
|
|
|
|
*/
|
|
|
|
register HODMAEN {
|
|
|
|
address 0x07A
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Scatter/Gather Host Address
|
|
|
|
*/
|
|
|
|
register SGHADDR {
|
|
|
|
address 0x07C
|
|
|
|
access_mode RW
|
|
|
|
size 8
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Host Address
|
|
|
|
*/
|
|
|
|
register SCBHADDR {
|
|
|
|
address 0x07C
|
|
|
|
access_mode RW
|
|
|
|
size 8
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Scatter/Gather Host Count
|
|
|
|
*/
|
|
|
|
register SGHCNT {
|
|
|
|
address 0x084
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Host Count
|
|
|
|
*/
|
|
|
|
register SCBHCNT {
|
|
|
|
address 0x084
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Threshold
|
|
|
|
*/
|
|
|
|
register DFF_THRSH {
|
|
|
|
address 0x088
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field WR_DFTHRSH 0x70 {
|
|
|
|
WR_DFTHRSH_MIN,
|
|
|
|
WR_DFTHRSH_25,
|
|
|
|
WR_DFTHRSH_50,
|
|
|
|
WR_DFTHRSH_63,
|
|
|
|
WR_DFTHRSH_75,
|
|
|
|
WR_DFTHRSH_85,
|
|
|
|
WR_DFTHRSH_90,
|
|
|
|
WR_DFTHRSH_MAX
|
|
|
|
}
|
|
|
|
field RD_DFTHRSH 0x07 {
|
|
|
|
RD_DFTHRSH_MIN,
|
|
|
|
RD_DFTHRSH_25,
|
|
|
|
RD_DFTHRSH_50,
|
|
|
|
RD_DFTHRSH_63,
|
|
|
|
RD_DFTHRSH_75,
|
|
|
|
RD_DFTHRSH_85,
|
|
|
|
RD_DFTHRSH_90,
|
|
|
|
RD_DFTHRSH_MAX
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ROM Address
|
|
|
|
*/
|
|
|
|
register ROMADDR {
|
|
|
|
address 0x08A
|
|
|
|
access_mode RW
|
|
|
|
size 3
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ROM Control
|
|
|
|
*/
|
|
|
|
register ROMCNTRL {
|
|
|
|
address 0x08D
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field ROMOP 0xE0
|
|
|
|
field ROMSPD 0x18
|
|
|
|
field REPEAT 0x02
|
|
|
|
field RDY 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ROM Data
|
|
|
|
*/
|
|
|
|
register ROMDATA {
|
|
|
|
address 0x08E
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Receive Message 0
|
|
|
|
*/
|
|
|
|
register DCHRXMSG0 {
|
|
|
|
address 0x090
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDNUM 0xF8
|
|
|
|
field CFNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Recieve Message 0
|
|
|
|
*/
|
|
|
|
register CMCRXMSG0 {
|
|
|
|
address 0x090
|
|
|
|
access_mode RO
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDNUM 0xF8
|
|
|
|
field CFNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Recieve Message 0
|
|
|
|
*/
|
|
|
|
register OVLYRXMSG0 {
|
|
|
|
address 0x090
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDNUM 0xF8
|
|
|
|
field CFNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Relaxed Order Enable
|
|
|
|
*/
|
|
|
|
register ROENABLE {
|
|
|
|
address 0x090
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field MSIROEN 0x20
|
|
|
|
field OVLYROEN 0x10
|
|
|
|
field CMCROEN 0x08
|
|
|
|
field SGROEN 0x04
|
|
|
|
field DCH1ROEN 0x02
|
|
|
|
field DCH0ROEN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Receive Message 1
|
|
|
|
*/
|
|
|
|
register DCHRXMSG1 {
|
|
|
|
address 0x091
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CBNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Recieve Message 1
|
|
|
|
*/
|
|
|
|
register CMCRXMSG1 {
|
|
|
|
address 0x091
|
|
|
|
access_mode RO
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field CBNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Recieve Message 1
|
|
|
|
*/
|
|
|
|
register OVLYRXMSG1 {
|
|
|
|
address 0x091
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CBNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* No Snoop Enable
|
|
|
|
*/
|
|
|
|
register NSENABLE {
|
|
|
|
address 0x091
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field MSINSEN 0x20
|
|
|
|
field OVLYNSEN 0x10
|
|
|
|
field CMCNSEN 0x08
|
|
|
|
field SGNSEN 0x04
|
|
|
|
field DCH1NSEN 0x02
|
|
|
|
field DCH0NSEN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Receive Message 2
|
|
|
|
*/
|
|
|
|
register DCHRXMSG2 {
|
|
|
|
address 0x092
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field MINDEX 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Recieve Message 2
|
|
|
|
*/
|
|
|
|
register CMCRXMSG2 {
|
|
|
|
address 0x092
|
|
|
|
access_mode RO
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field MINDEX 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Recieve Message 2
|
|
|
|
*/
|
|
|
|
register OVLYRXMSG2 {
|
|
|
|
address 0x092
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field MINDEX 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Outstanding Split Transactions
|
|
|
|
*/
|
|
|
|
register OST {
|
|
|
|
address 0x092
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Receive Message 3
|
|
|
|
*/
|
|
|
|
register DCHRXMSG3 {
|
|
|
|
address 0x093
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field MCLASS 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Recieve Message 3
|
|
|
|
*/
|
|
|
|
register CMCRXMSG3 {
|
|
|
|
address 0x093
|
|
|
|
access_mode RO
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field MCLASS 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Recieve Message 3
|
|
|
|
*/
|
|
|
|
register OVLYRXMSG3 {
|
|
|
|
address 0x093
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field MCLASS 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PCI-X Control
|
|
|
|
*/
|
|
|
|
register PCIXCTL {
|
|
|
|
address 0x093
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field SERRPULSE 0x80
|
|
|
|
field UNEXPSCIEN 0x20
|
|
|
|
field SPLTSMADIS 0x10
|
|
|
|
field SPLTSTADIS 0x08
|
|
|
|
field SRSPDPEEN 0x04
|
|
|
|
field TSCSERREN 0x02
|
|
|
|
field CMPABCDIS 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Sequencer Byte Count
|
|
|
|
*/
|
|
|
|
register CMCSEQBCNT {
|
|
|
|
address 0x094
|
|
|
|
access_mode RO
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Sequencer Byte Count
|
|
|
|
*/
|
|
|
|
register OVLYSEQBCNT {
|
|
|
|
address 0x094
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Sequencer Byte Count
|
|
|
|
*/
|
|
|
|
register DCHSEQBCNT {
|
|
|
|
address 0x094
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Split Status 0
|
|
|
|
*/
|
|
|
|
register DCHSPLTSTAT0 {
|
|
|
|
address 0x096
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field STAETERM 0x80
|
|
|
|
field SCBCERR 0x40
|
|
|
|
field SCADERR 0x20
|
|
|
|
field SCDATBUCKET 0x10
|
|
|
|
field CNTNOTCMPLT 0x08
|
|
|
|
field RXOVRUN 0x04
|
|
|
|
field RXSCEMSG 0x02
|
|
|
|
field RXSPLTRSP 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Split Status 0
|
|
|
|
*/
|
|
|
|
register CMCSPLTSTAT0 {
|
|
|
|
address 0x096
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field STAETERM 0x80
|
|
|
|
field SCBCERR 0x40
|
|
|
|
field SCADERR 0x20
|
|
|
|
field SCDATBUCKET 0x10
|
|
|
|
field CNTNOTCMPLT 0x08
|
|
|
|
field RXOVRUN 0x04
|
|
|
|
field RXSCEMSG 0x02
|
|
|
|
field RXSPLTRSP 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Split Status 0
|
|
|
|
*/
|
|
|
|
register OVLYSPLTSTAT0 {
|
|
|
|
address 0x096
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field STAETERM 0x80
|
|
|
|
field SCBCERR 0x40
|
|
|
|
field SCADERR 0x20
|
|
|
|
field SCDATBUCKET 0x10
|
|
|
|
field CNTNOTCMPLT 0x08
|
|
|
|
field RXOVRUN 0x04
|
|
|
|
field RXSCEMSG 0x02
|
|
|
|
field RXSPLTRSP 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Channel Split Status 1
|
|
|
|
*/
|
|
|
|
register DCHSPLTSTAT1 {
|
|
|
|
address 0x097
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field RXDATABUCKET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Split Status 1
|
|
|
|
*/
|
|
|
|
register CMCSPLTSTAT1 {
|
|
|
|
address 0x097
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field RXDATABUCKET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay Split Status 1
|
|
|
|
*/
|
|
|
|
register OVLYSPLTSTAT1 {
|
|
|
|
address 0x097
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field RXDATABUCKET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Receive Message 0
|
|
|
|
*/
|
|
|
|
register SGRXMSG0 {
|
|
|
|
address 0x098
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDNUM 0xF8
|
|
|
|
field CFNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Receive Message 1
|
|
|
|
*/
|
|
|
|
register SGRXMSG1 {
|
|
|
|
address 0x099
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CBNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Receive Message 2
|
|
|
|
*/
|
|
|
|
register SGRXMSG2 {
|
|
|
|
address 0x09A
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field MINDEX 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Receive Message 3
|
|
|
|
*/
|
|
|
|
register SGRXMSG3 {
|
|
|
|
address 0x09B
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field MCLASS 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Address 0
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTADR0 {
|
|
|
|
address 0x098
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LOWER_ADDR 0x7F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Address 1
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTADR1 {
|
|
|
|
address 0x099
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field REQ_DNUM 0xF8
|
|
|
|
field REQ_FNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Address 2
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTADR2 {
|
|
|
|
address 0x09A
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field REQ_BNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Address 3
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTADR3 {
|
|
|
|
address 0x09B
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field RLXORD 020
|
|
|
|
field TAG_NUM 0x1F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SG Sequencer Byte Count
|
|
|
|
*/
|
|
|
|
register SGSEQBCNT {
|
|
|
|
address 0x09C
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Attribute 0
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTATTR0 {
|
|
|
|
address 0x09C
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LOWER_BCNT 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Attribute 1
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTATTR1 {
|
|
|
|
address 0x09D
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CMPLT_DNUM 0xF8
|
|
|
|
field CMPLT_FNUM 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Slave Split Out Attribute 2
|
|
|
|
*/
|
|
|
|
register SLVSPLTOUTATTR2 {
|
|
|
|
address 0x09E
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CMPLT_BNUM 0xFF
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
* S/G Split Status 0
|
|
|
|
*/
|
|
|
|
register SGSPLTSTAT0 {
|
|
|
|
address 0x09E
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field STAETERM 0x80
|
|
|
|
field SCBCERR 0x40
|
|
|
|
field SCADERR 0x20
|
|
|
|
field SCDATBUCKET 0x10
|
|
|
|
field CNTNOTCMPLT 0x08
|
|
|
|
field RXOVRUN 0x04
|
|
|
|
field RXSCEMSG 0x02
|
|
|
|
field RXSPLTRSP 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G Split Status 1
|
|
|
|
*/
|
|
|
|
register SGSPLTSTAT1 {
|
|
|
|
address 0x09F
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field RXDATABUCKET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Special Function
|
|
|
|
*/
|
|
|
|
register SFUNCT {
|
|
|
|
address 0x09f
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field TEST_GROUP 0xF0
|
|
|
|
field TEST_NUM 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO 0 PCI Status
|
|
|
|
*/
|
|
|
|
register DF0PCISTAT {
|
|
|
|
address 0x0A0
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field SCAAPERR 0x08
|
|
|
|
field RDPERR 0x04
|
|
|
|
field TWATERR 0x02
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO 1 PCI Status
|
|
|
|
*/
|
|
|
|
register DF1PCISTAT {
|
|
|
|
address 0x0A1
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field SCAAPERR 0x08
|
|
|
|
field RDPERR 0x04
|
|
|
|
field TWATERR 0x02
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* S/G PCI Status
|
|
|
|
*/
|
|
|
|
register SGPCISTAT {
|
|
|
|
address 0x0A2
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field SCAAPERR 0x08
|
|
|
|
field RDPERR 0x04
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC PCI Status
|
|
|
|
*/
|
|
|
|
register CMCPCISTAT {
|
|
|
|
address 0x0A3
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field SCAAPERR 0x08
|
|
|
|
field RDPERR 0x04
|
|
|
|
field TWATERR 0x02
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Overlay PCI Status
|
|
|
|
*/
|
|
|
|
register OVLYPCISTAT {
|
|
|
|
address 0x0A4
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field SCAAPERR 0x08
|
|
|
|
field RDPERR 0x04
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PCI Status for MSI Master DMA Transfer
|
|
|
|
*/
|
|
|
|
register MSIPCISTAT {
|
|
|
|
address 0x0A6
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field SSE 0x40
|
|
|
|
field RMA 0x20
|
|
|
|
field RTA 0x10
|
|
|
|
field CLRPENDMSI 0x08
|
|
|
|
field TWATERR 0x02
|
|
|
|
field DPR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PCI Status for Target
|
|
|
|
*/
|
|
|
|
register TARGPCISTAT {
|
2002-12-04 22:51:29 +00:00
|
|
|
address 0x0A7
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPE 0x80
|
|
|
|
field SSE 0x40
|
|
|
|
field STA 0x08
|
|
|
|
field TWATERR 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQ Packet In
|
|
|
|
* The last LQ Packet recieved
|
|
|
|
*/
|
|
|
|
register LQIN {
|
|
|
|
address 0x020
|
|
|
|
access_mode RW
|
|
|
|
size 20
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Type Pointer
|
|
|
|
* SCB offset for Target Mode SCB type information
|
|
|
|
*/
|
|
|
|
register TYPEPTR {
|
|
|
|
address 0x020
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Queue Tag Pointer
|
|
|
|
* SCB offset to the Two Byte tag identifier used for target mode.
|
|
|
|
*/
|
|
|
|
register TAGPTR {
|
|
|
|
address 0x021
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Logical Unit Number Pointer
|
|
|
|
* SCB offset to the LSB (little endian) of the lun field.
|
|
|
|
*/
|
|
|
|
register LUNPTR {
|
|
|
|
address 0x022
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Length Pointer
|
|
|
|
* SCB offset for the 4 byte data length field in target mode.
|
|
|
|
*/
|
|
|
|
register DATALENPTR {
|
|
|
|
address 0x023
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Status Length Pointer
|
|
|
|
* SCB offset to the two byte status field in target SCBs.
|
|
|
|
*/
|
|
|
|
register STATLENPTR {
|
|
|
|
address 0x024
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Command Length Pointer
|
|
|
|
* Scb offset for the CDB length field in initiator SCBs.
|
|
|
|
*/
|
|
|
|
register CMDLENPTR {
|
|
|
|
address 0x025
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Task Attribute Pointer
|
|
|
|
* Scb offset for the byte field specifying the attribute byte
|
|
|
|
* to be used in command packets.
|
|
|
|
*/
|
|
|
|
register ATTRPTR {
|
|
|
|
address 0x026
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Task Management Flags Pointer
|
|
|
|
* Scb offset for the byte field specifying the attribute flags
|
|
|
|
* byte to be used in command packets.
|
|
|
|
*/
|
|
|
|
register FLAGPTR {
|
|
|
|
address 0x027
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Command Pointer
|
|
|
|
* Scb offset for the first byte in the CDB for initiator SCBs.
|
|
|
|
*/
|
|
|
|
register CMDPTR {
|
|
|
|
address 0x028
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Queue Next Pointer
|
|
|
|
* Scb offset for the 2 byte "next scb link".
|
|
|
|
*/
|
|
|
|
register QNEXTPTR {
|
|
|
|
address 0x029
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI ID Pointer
|
|
|
|
* Scb offset to the value to place in the SCSIID register
|
|
|
|
* during target mode connections.
|
|
|
|
*/
|
|
|
|
register IDPTR {
|
|
|
|
address 0x02A
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Command Aborted Byte Pointer
|
|
|
|
* Offset to the SCB flags field that includes the
|
|
|
|
* "SCB aborted" status bit.
|
|
|
|
*/
|
|
|
|
register ABRTBYTEPTR {
|
|
|
|
address 0x02B
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Command Aborted Bit Pointer
|
|
|
|
* Bit offset in the SCB flags field for "SCB aborted" status.
|
|
|
|
*/
|
|
|
|
register ABRTBITPTR {
|
|
|
|
address 0x02C
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
2002-08-31 06:49:11 +00:00
|
|
|
/*
|
|
|
|
* Rev B or greater.
|
|
|
|
*/
|
|
|
|
register MAXCMDBYTES {
|
|
|
|
address 0x02D
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Rev B or greater.
|
|
|
|
*/
|
|
|
|
register MAXCMD2RCV {
|
|
|
|
address 0x02E
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Rev B or greater.
|
|
|
|
*/
|
|
|
|
register SHORTTHRESH {
|
|
|
|
address 0x02F
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Logical Unit Number Length
|
|
|
|
* The length, in bytes, of the SCB lun field.
|
|
|
|
*/
|
|
|
|
register LUNLEN {
|
|
|
|
address 0x030
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2003-05-30 02:14:22 +00:00
|
|
|
mask ILUNLEN 0x0F
|
|
|
|
mask TLUNLEN 0xF0
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
2003-05-30 02:14:22 +00:00
|
|
|
const LUNLEN_SINGLE_LEVEL_LUN 0xF
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* CDB Limit
|
|
|
|
* The size, in bytes, of the embedded CDB field in initator SCBs.
|
|
|
|
*/
|
|
|
|
register CDBLIMIT {
|
|
|
|
address 0x031
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Maximum Commands
|
|
|
|
* The maximum number of commands to issue during a
|
|
|
|
* single packetized connection.
|
|
|
|
*/
|
|
|
|
register MAXCMD {
|
|
|
|
address 0x032
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Maximum Command Counter
|
|
|
|
* The number of commands already sent during this connection
|
|
|
|
*/
|
|
|
|
register MAXCMDCNT {
|
|
|
|
address 0x033
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQ Packet Reserved Bytes
|
|
|
|
* The bytes to be sent in the currently reserved fileds
|
|
|
|
* of all LQ packets.
|
|
|
|
*/
|
|
|
|
register LQRSVD01 {
|
|
|
|
address 0x034
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
register LQRSVD16 {
|
|
|
|
address 0x035
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
register LQRSVD17 {
|
|
|
|
address 0x036
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Command Reserved 0
|
|
|
|
* The byte to be sent for the reserved byte 0 of
|
|
|
|
* outgoing command packets.
|
|
|
|
*/
|
|
|
|
register CMDRSVD0 {
|
|
|
|
address 0x037
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQ Manager Control 0
|
|
|
|
*/
|
|
|
|
register LQCTL0 {
|
|
|
|
address 0x038
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQITARGCLT 0xC0
|
|
|
|
field LQIINITGCLT 0x30
|
|
|
|
field LQ0TARGCLT 0x0C
|
|
|
|
field LQ0INITGCLT 0x03
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQ Manager Control 1
|
|
|
|
*/
|
|
|
|
register LQCTL1 {
|
|
|
|
address 0x038
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field PCI2PCI 0x04
|
|
|
|
field SINGLECMD 0x02
|
|
|
|
field ABORTPENDING 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQ Manager Control 2
|
|
|
|
*/
|
|
|
|
register LQCTL2 {
|
|
|
|
address 0x039
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQIRETRY 0x80
|
|
|
|
field LQICONTINUE 0x40
|
|
|
|
field LQITOIDLE 0x20
|
|
|
|
field LQIPAUSE 0x10
|
|
|
|
field LQORETRY 0x08
|
|
|
|
field LQOCONTINUE 0x04
|
|
|
|
field LQOTOIDLE 0x02
|
|
|
|
field LQOPAUSE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI RAM BIST0
|
|
|
|
*/
|
|
|
|
register SCSBIST0 {
|
|
|
|
address 0x039
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field GSBISTERR 0x40
|
|
|
|
field GSBISTDONE 0x20
|
|
|
|
field GSBISTRUN 0x10
|
|
|
|
field OSBISTERR 0x04
|
|
|
|
field OSBISTDONE 0x02
|
|
|
|
field OSBISTRUN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Sequence Control0
|
|
|
|
*/
|
|
|
|
register SCSISEQ0 {
|
|
|
|
address 0x03A
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field TEMODEO 0x80
|
|
|
|
field ENSELO 0x40
|
|
|
|
field ENARBO 0x20
|
|
|
|
field FORCEBUSFREE 0x10
|
|
|
|
field SCSIRSTO 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI RAM BIST 1
|
|
|
|
*/
|
|
|
|
register SCSBIST1 {
|
|
|
|
address 0x03A
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field NTBISTERR 0x04
|
|
|
|
field NTBISTDONE 0x02
|
|
|
|
field NTBISTRUN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Sequence Control 1
|
|
|
|
*/
|
|
|
|
register SCSISEQ1 {
|
|
|
|
address 0x03B
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field MANUALCTL 0x40
|
|
|
|
field ENSELI 0x20
|
|
|
|
field ENRSELI 0x10
|
|
|
|
field MANUALP 0x0C
|
|
|
|
field ENAUTOATNP 0x02
|
|
|
|
field ALTSTIM 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Transfer Control 0
|
|
|
|
*/
|
|
|
|
register SXFRCTL0 {
|
|
|
|
address 0x03C
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field DFON 0x80
|
|
|
|
field DFPEXP 0x40
|
|
|
|
field BIOSCANCELEN 0x10
|
|
|
|
field SPIOEN 0x08
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Transfer Control 1
|
|
|
|
*/
|
|
|
|
register SXFRCTL1 {
|
|
|
|
address 0x03D
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field BITBUCKET 0x80
|
|
|
|
field ENSACHK 0x40
|
|
|
|
field ENSPCHK 0x20
|
|
|
|
field STIMESEL 0x18
|
|
|
|
field ENSTIMER 0x04
|
|
|
|
field ACTNEGEN 0x02
|
|
|
|
field STPWEN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Transfer Control 2
|
|
|
|
*/
|
|
|
|
register SXFRCTL2 {
|
|
|
|
address 0x03E
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field AUTORSTDIS 0x10
|
|
|
|
field CMDDMAEN 0x08
|
|
|
|
field ASU 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Bus Initiator IDs
|
|
|
|
* Bitmask of observed initiators on the bus.
|
|
|
|
*/
|
|
|
|
register BUSINITID {
|
|
|
|
address 0x03C
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Length Counters
|
|
|
|
* Packet byte counter.
|
|
|
|
*/
|
|
|
|
register DLCOUNT {
|
|
|
|
address 0x03C
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
size 3
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Status
|
|
|
|
*/
|
|
|
|
register DFFSTAT {
|
|
|
|
address 0x03F
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field FIFO1FREE 0x20
|
|
|
|
field FIFO0FREE 0x10
|
2002-12-01 08:13:37 +00:00
|
|
|
/*
|
|
|
|
* On the B, this enum only works
|
|
|
|
* in the read direction. For writes,
|
|
|
|
* you must use the B version of the
|
|
|
|
* CURRFIFO_0 definition which is defined
|
|
|
|
* as a constant outside of this register
|
|
|
|
* definition to avoid confusing the
|
|
|
|
* register pretty printing code.
|
|
|
|
*/
|
|
|
|
enum CURRFIFO 0x03 {
|
|
|
|
CURRFIFO_0,
|
|
|
|
CURRFIFO_1,
|
|
|
|
CURRFIFO_NONE 0x3
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
2002-12-01 08:13:37 +00:00
|
|
|
const B_CURRFIFO_0 0x2
|
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* SCSI Bus Target IDs
|
|
|
|
* Bitmask of observed targets on the bus.
|
|
|
|
*/
|
|
|
|
register BUSTARGID {
|
|
|
|
address 0x03E
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Control Signal Out
|
|
|
|
*/
|
|
|
|
register SCSISIGO {
|
|
|
|
address 0x040
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDO 0x80
|
|
|
|
field IOO 0x40
|
|
|
|
field MSGO 0x20
|
|
|
|
field ATNO 0x10
|
|
|
|
field SELO 0x08
|
|
|
|
field BSYO 0x04
|
|
|
|
field REQO 0x02
|
|
|
|
field ACKO 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Possible phases to write into SCSISIG0
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
enum PHASE_MASK CDO|IOO|MSGO {
|
|
|
|
P_DATAOUT 0x0,
|
|
|
|
P_DATAIN IOO,
|
|
|
|
P_DATAOUT_DT P_DATAOUT|MSGO,
|
|
|
|
P_DATAIN_DT P_DATAIN|MSGO,
|
|
|
|
P_COMMAND CDO,
|
|
|
|
P_MESGOUT CDO|MSGO,
|
|
|
|
P_STATUS CDO|IOO,
|
|
|
|
P_MESGIN CDO|IOO|MSGO
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
register SCSISIGI {
|
|
|
|
address 0x041
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDI 0x80
|
|
|
|
field IOI 0x40
|
|
|
|
field MSGI 0x20
|
|
|
|
field ATNI 0x10
|
|
|
|
field SELI 0x08
|
|
|
|
field BSYI 0x04
|
|
|
|
field REQI 0x02
|
|
|
|
field ACKI 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Possible phases in SCSISIGI
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
enum PHASE_MASK CDO|IOO|MSGO {
|
|
|
|
P_DATAOUT 0x0,
|
|
|
|
P_DATAIN IOO,
|
|
|
|
P_DATAOUT_DT P_DATAOUT|MSGO,
|
|
|
|
P_DATAIN_DT P_DATAIN|MSGO,
|
|
|
|
P_COMMAND CDO,
|
|
|
|
P_MESGOUT CDO|MSGO,
|
|
|
|
P_STATUS CDO|IOO,
|
|
|
|
P_MESGIN CDO|IOO|MSGO
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Multiple Target IDs
|
|
|
|
* Bitmask of ids to respond as a target.
|
|
|
|
*/
|
|
|
|
register MULTARGID {
|
|
|
|
address 0x040
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Phase
|
|
|
|
*/
|
|
|
|
register SCSIPHASE {
|
|
|
|
address 0x042
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field STATUS_PHASE 0x20
|
|
|
|
field COMMAND_PHASE 0x10
|
|
|
|
field MSG_IN_PHASE 0x08
|
|
|
|
field MSG_OUT_PHASE 0x04
|
|
|
|
field DATA_PHASE_MASK 0x03 {
|
|
|
|
DATA_OUT_PHASE 0x01,
|
|
|
|
DATA_IN_PHASE 0x02
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Data 0 Image
|
|
|
|
*/
|
|
|
|
register SCSIDAT0_IMG {
|
|
|
|
address 0x043
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Latched Data
|
|
|
|
*/
|
|
|
|
register SCSIDAT {
|
|
|
|
address 0x044
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Data Bus
|
|
|
|
*/
|
|
|
|
register SCSIBUS {
|
|
|
|
address 0x046
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Target ID In
|
|
|
|
*/
|
|
|
|
register TARGIDIN {
|
|
|
|
address 0x048
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLKOUT 0x80
|
|
|
|
field TARGID 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Selection/Reselection ID
|
|
|
|
* Upper four bits are the device id. The ONEBIT is set when the re/selecting
|
|
|
|
* device did not set its own ID.
|
|
|
|
*/
|
|
|
|
register SELID {
|
|
|
|
address 0x049
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field SELID_MASK 0xf0
|
|
|
|
field ONEBIT 0x08
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Block Control
|
|
|
|
* Controls Bus type and channel selection. SELWIDE allows for the
|
|
|
|
* coexistence of 8bit and 16bit devices on a wide bus.
|
|
|
|
*/
|
|
|
|
register SBLKCTL {
|
|
|
|
address 0x04A
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field DIAGLEDEN 0x80
|
|
|
|
field DIAGLEDON 0x40
|
|
|
|
field ENAB40 0x08 /* LVD transceiver active */
|
|
|
|
field ENAB20 0x04 /* SE/HVD transceiver active */
|
|
|
|
field SELWIDE 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Option Mode
|
|
|
|
*/
|
|
|
|
register OPTIONMODE {
|
|
|
|
address 0x04A
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field BIOSCANCTL 0x80
|
|
|
|
field AUTOACKEN 0x40
|
|
|
|
field BIASCANCTL 0x20
|
|
|
|
field BUSFREEREV 0x10
|
|
|
|
field ENDGFORMCHK 0x04
|
|
|
|
field AUTO_MSGOUT_DE 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
mask OPTIONMODE_DEFAULTS AUTO_MSGOUT_DE
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Status 0
|
|
|
|
*/
|
|
|
|
register SSTAT0 {
|
|
|
|
address 0x04B
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field TARGET 0x80 /* Board acting as target */
|
|
|
|
field SELDO 0x40 /* Selection Done */
|
|
|
|
field SELDI 0x20 /* Board has been selected */
|
|
|
|
field SELINGO 0x10 /* Selection In Progress */
|
|
|
|
field IOERR 0x08 /* LVD Tranceiver mode changed */
|
|
|
|
field OVERRUN 0x04 /* SCSI Offset overrun detected */
|
|
|
|
field SPIORDY 0x02 /* SCSI PIO Ready */
|
|
|
|
field ARBDO 0x01 /* Arbitration Done Out */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear SCSI Interrupt 0
|
|
|
|
* Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
|
|
|
|
*/
|
|
|
|
register CLRSINT0 {
|
|
|
|
address 0x04B
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRSELDO 0x40
|
|
|
|
field CLRSELDI 0x20
|
|
|
|
field CLRSELINGO 0x10
|
|
|
|
field CLRIOERR 0x08
|
|
|
|
field CLROVERRUN 0x04
|
|
|
|
field CLRSPIORDY 0x02
|
|
|
|
field CLRARBDO 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Interrupt Mode 0
|
|
|
|
* Setting any bit will enable the corresponding function
|
|
|
|
* in SIMODE0 to interrupt via the IRQ pin.
|
|
|
|
*/
|
|
|
|
register SIMODE0 {
|
|
|
|
address 0x04B
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENSELDO 0x40
|
|
|
|
field ENSELDI 0x20
|
|
|
|
field ENSELINGO 0x10
|
|
|
|
field ENIOERR 0x08
|
|
|
|
field ENOVERRUN 0x04
|
|
|
|
field ENSPIORDY 0x02
|
|
|
|
field ENARBDO 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Status 1
|
|
|
|
*/
|
|
|
|
register SSTAT1 {
|
|
|
|
address 0x04C
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field SELTO 0x80
|
|
|
|
field ATNTARG 0x40
|
|
|
|
field SCSIRSTI 0x20
|
|
|
|
field PHASEMIS 0x10
|
|
|
|
field BUSFREE 0x08
|
|
|
|
field SCSIPERR 0x04
|
|
|
|
field STRB2FAST 0x02
|
|
|
|
field REQINIT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear SCSI Interrupt 1
|
|
|
|
* Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
|
|
|
|
*/
|
|
|
|
register CLRSINT1 {
|
2002-09-26 22:54:00 +00:00
|
|
|
address 0x04C
|
2002-06-05 19:52:45 +00:00
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRSELTIMEO 0x80
|
|
|
|
field CLRATNO 0x40
|
|
|
|
field CLRSCSIRSTI 0x20
|
|
|
|
field CLRBUSFREE 0x08
|
|
|
|
field CLRSCSIPERR 0x04
|
|
|
|
field CLRSTRB2FAST 0x02
|
|
|
|
field CLRREQINIT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Status 2
|
|
|
|
*/
|
|
|
|
register SSTAT2 {
|
|
|
|
address 0x04d
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field BUSFREETIME 0xc0 {
|
|
|
|
BUSFREE_LQO 0x40,
|
|
|
|
BUSFREE_DFF0 0x80,
|
|
|
|
BUSFREE_DFF1 0xC0
|
|
|
|
}
|
|
|
|
field NONPACKREQ 0x20
|
|
|
|
field EXP_ACTIVE 0x10 /* SCSI Expander Active */
|
|
|
|
field BSYX 0x08 /* Busy Expander */
|
|
|
|
field WIDE_RES 0x04 /* Modes 0 and 1 only */
|
|
|
|
field SDONE 0x02 /* Modes 0 and 1 only */
|
|
|
|
field DMADONE 0x01 /* Modes 0 and 1 only */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear SCSI Interrupt 2
|
|
|
|
*/
|
|
|
|
register CLRSINT2 {
|
|
|
|
address 0x04D
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRNONPACKREQ 0x20
|
|
|
|
field CLRWIDE_RES 0x04 /* Modes 0 and 1 only */
|
|
|
|
field CLRSDONE 0x02 /* Modes 0 and 1 only */
|
|
|
|
field CLRDMADONE 0x01 /* Modes 0 and 1 only */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Interrupt Mode 2
|
|
|
|
*/
|
|
|
|
register SIMODE2 {
|
|
|
|
address 0x04D
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENWIDE_RES 0x04
|
|
|
|
field ENSDONE 0x02
|
|
|
|
field ENDMADONE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Physical Error Diagnosis
|
|
|
|
*/
|
|
|
|
register PERRDIAG {
|
|
|
|
address 0x04E
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field HIZERO 0x80
|
|
|
|
field HIPERR 0x40
|
|
|
|
field PREVPHASE 0x20
|
|
|
|
field PARITYERR 0x10
|
|
|
|
field AIPERR 0x08
|
|
|
|
field CRCERR 0x04
|
|
|
|
field DGFORMERR 0x02
|
|
|
|
field DTERR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Current State
|
|
|
|
*/
|
|
|
|
register LQISTATE {
|
|
|
|
address 0x04E
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Offset Count
|
|
|
|
*/
|
|
|
|
register SOFFCNT {
|
|
|
|
address 0x04F
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Current State
|
|
|
|
*/
|
|
|
|
register LQOSTATE {
|
|
|
|
address 0x04F
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Status
|
|
|
|
*/
|
|
|
|
register LQISTAT0 {
|
|
|
|
address 0x050
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQIATNQAS 0x20
|
|
|
|
field LQICRCT1 0x10
|
|
|
|
field LQICRCT2 0x08
|
|
|
|
field LQIBADLQT 0x04
|
|
|
|
field LQIATNLQ 0x02
|
|
|
|
field LQIATNCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear LQI Interrupts 0
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
register CLRLQIINT0 {
|
2002-06-05 19:52:45 +00:00
|
|
|
address 0x050
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRLQIATNQAS 0x20
|
|
|
|
field CLRLQICRCT1 0x10
|
|
|
|
field CLRLQICRCT2 0x08
|
|
|
|
field CLRLQIBADLQT 0x04
|
|
|
|
field CLRLQIATNLQ 0x02
|
|
|
|
field CLRLQIATNCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Interrupt Mode 0
|
|
|
|
*/
|
|
|
|
register LQIMODE0 {
|
|
|
|
address 0x050
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENLQIATNQASK 0x20
|
|
|
|
field ENLQICRCT1 0x10
|
|
|
|
field ENLQICRCT2 0x08
|
|
|
|
field ENLQIBADLQT 0x04
|
|
|
|
field ENLQIATNLQ 0x02
|
|
|
|
field ENLQIATNCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Status 1
|
|
|
|
*/
|
|
|
|
register LQISTAT1 {
|
|
|
|
address 0x051
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQIPHASE_LQ 0x80
|
|
|
|
field LQIPHASE_NLQ 0x40
|
|
|
|
field LQIABORT 0x20
|
|
|
|
field LQICRCI_LQ 0x10
|
|
|
|
field LQICRCI_NLQ 0x08
|
|
|
|
field LQIBADLQI 0x04
|
|
|
|
field LQIOVERI_LQ 0x02
|
|
|
|
field LQIOVERI_NLQ 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear LQI Manager Interrupts1
|
|
|
|
*/
|
|
|
|
register CLRLQIINT1 {
|
|
|
|
address 0x051
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRLQIPHASE_LQ 0x80
|
|
|
|
field CLRLQIPHASE_NLQ 0x40
|
|
|
|
field CLRLIQABORT 0x20
|
|
|
|
field CLRLQICRCI_LQ 0x10
|
|
|
|
field CLRLQICRCI_NLQ 0x08
|
|
|
|
field CLRLQIBADLQI 0x04
|
|
|
|
field CLRLQIOVERI_LQ 0x02
|
|
|
|
field CLRLQIOVERI_NLQ 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Interrupt Mode 1
|
|
|
|
*/
|
|
|
|
register LQIMODE1 {
|
|
|
|
address 0x051
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
aic79xx.c:
Clear the LQICRC_NLQ status should it pop up after we have
already handled the SCSIPERR. During some streaming operations
this status can be delayed until the stream ends. Without this
change, the driver would complain about a "Missing case in
ahd_handle_scsiint".
In the LQOBUSFREE handler...
Don't return the LQOMGR back to the idle state until after
we have cleaned up ENSELO and any status related to this
selection. The last thing we need is the LQO manager starting
another select-out before we have updated the execution queue.
It is not clear whether the LQOMGR would, or would not
start a new selection early.
Make sure ENSELO is off prior to clearing SELDO by flushing
device writes.
Move assignment of the next target SCB pointer inside of
an if to make the code clearer. The effect is the same.
Dump card state in both "Unexpected PKT busfree" paths.
In ahd_reset(), set the chip to SCSI mode before reading SXFRCTL1.
That register only exists in the SCSI mode. Also set the mode
explicitly to the SCSI mode after chip reset due to paranoia.
Re-arrange code so that SXFRCTL1 is restored as quickly after the
chip reset as possible.
S/G structurs must be 8byte aligned. Make this official by saying
so in our DMA tag.
Disable CIO bus stretch on MDFFSTAT if SHVALID is about to come
true. This can cause a CIO bus lockup if a PCI or PCI-X error
occurs while the stretch is occurring - the host cannot service
the PCI-X error since the CIO bus is locked out and SHVALID will
never resolve. The stretch was added in the Rev B to simplify the
wait for SHVALID to resolve, but the code to do this in the open
source sequencer is so simple it was never removed.
Consistently use MAX_OFFSET for the user max syncrate set from
non-volatile storage. This ensures that the offset does not
conflict with AH?_OFFSET_UNKNOWN.
Have ahd_pause_and_flushwork set the mode to ensure that it has
access to the registers it checks. Also modify the checking of
intstat so that the check against 0xFF can actually succeed if
the INT_PEND mask is something other than 0xFF. Although there
are no cardbus U320 controllers, this check may be needed to
recover from a hot-plug PCI removal that occurs without informing
the driver.
Fix a typo. sg_prefetch_cnt -> sg_prefetch_align. This fixes
an infinite loop at card initialization if the cacheline size is 0.
aic79xx.h:
Add AHD_EARLY_REQ_BUG bug flag.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
Change AH?_OFFSET_UNKNOWN to 0xFF. This is a value that the
curr->offset can never be, unlike '0' which we previously used.
This fixes code that only checks for a non-zero offset to
determine if a sync negotiation is required since it will fire
in the unknown case even if the goal is async.
aic79xx.reg:
Add comments for LQISTAT bits indicating their names in the 7902
data book. We use slightly different and more descriptive names
in the firmware.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
aic79xx.seq:
Update comments regarding rundown of the GSFIFO to reflect reality.
Fix spelling errors.
Since we use an 8byte address and 1 byte length, shorten the size
of a block move for the legacy DMA'ed CDB case from 11 to 9 bytes.
Remove code that, assuming the abort pending feature worked, would
set MK_MESSAGE in the SCB's control byte on completion to catch
invalid reselections. Since we don't see interrupts for completed
selections, this status update could occur prior to us noticing the
SELDO. The "select-out" queue logic will get confused by the
MK_MESSAGE bit being set as this is used to catch packatized
connections where we select-out with ATN. Since the abort pending
feature doesn't work on any released controllers yet, this code was
never executed.
Add support for the AHD_EARLY_REQ_BUG. Don't ignore persistent REQ
assertions just because they were asserted within the bus settle delay
window. This allows us to tolerate devices like the GEM318 that
violate the SCSI spec.
Remove unintentional settnig of SG_CACHE_AVAIL. Writing this bit
should have no effect, but who knows...
On the Rev A, we must wait for HDMAENACK before loading additional
segments to avoid clobbering the address of the first segment in
the S/G FIFO. This resolves data-corruption issues with certain
IBM (now Hitachi) and Fujitsu U320 drives.
Rearrange calc_residual to avoid an extra jmp instruction.
On RevA Silicon, if the target returns us to data-out after we
have already trained for data-out, it is possible for us to
transition the free running clock to data-valid before the required
100ns P1 setup time (8 P1 assertions in fast-160 mode). This will
only happen if this L-Q is a continuation of a data transfer for
which we have already prefetched data into our FIFO (LQ/Data
followed by LQ/Data for the same write transaction). This can
cause some target implementations to miss the first few data
transfers on the bus. We detect this situation by noticing that
this is the first data transfer after an LQ (LQIWORKONLQ true),
that the data transfer is a continuation of a transfer already
setup in our FIFO (SAVEPTRS interrupt), and that the transaction
is a write (DIRECTION set in DFCNTRL). The delay is performed by
disabling SCSIEN until we see the first REQ from the target.
Only compile in snapshot savepointers handler for RevA silicon
where it is enabled.
Handle the cfg4icmd packetized interrupt. We just need to load
the address and count, start the DMA, and CLRCHN once the transfer
is complete.
Fix an oversight in the overrun handler for packetized status
operations. We need to wait for either CTXTDONE or an overrun
when checking for an overrun. The previous code did not wait
and thus could decide that no overrun had occurred even though
an overrun will occur on the next data-valid req. Add some
comment to this section for clarity.
Use LAST_SEG_DONE instead of LASTSDONE for testing transfer
completion in the packetized status case. LASTSDONE may come up
more quickly since it only records completion on the SCSI side,
but since LAST_SEG_DONE is used everywhere else (and needs to be),
this is less confusing.
Add a missing invalidation of the longjmp address in the non-pack
handler. This code needs additional review.
aic79xx_inline.h:
Fix spelling error.
aic79xx_osm.c:
Set the cdb length for CDBs dma'ed from host memory.
Add a comment indicating that, should CAM start supporting cdbs
larger than 16bytes, the driver could store the CDB in the status
buffer.
aic79xx_pci.c:
Add a table entry for the 39320A.
Added a missing comma to an error string table.
Fix spelling errors.
2003-02-27 23:23:16 +00:00
|
|
|
field ENLQIPHASE_LQ 0x80 /* LQIPHASE1 */
|
|
|
|
field ENLQIPHASE_NLQ 0x40 /* LQIPHASE2 */
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENLIQABORT 0x20
|
aic79xx.c:
Clear the LQICRC_NLQ status should it pop up after we have
already handled the SCSIPERR. During some streaming operations
this status can be delayed until the stream ends. Without this
change, the driver would complain about a "Missing case in
ahd_handle_scsiint".
In the LQOBUSFREE handler...
Don't return the LQOMGR back to the idle state until after
we have cleaned up ENSELO and any status related to this
selection. The last thing we need is the LQO manager starting
another select-out before we have updated the execution queue.
It is not clear whether the LQOMGR would, or would not
start a new selection early.
Make sure ENSELO is off prior to clearing SELDO by flushing
device writes.
Move assignment of the next target SCB pointer inside of
an if to make the code clearer. The effect is the same.
Dump card state in both "Unexpected PKT busfree" paths.
In ahd_reset(), set the chip to SCSI mode before reading SXFRCTL1.
That register only exists in the SCSI mode. Also set the mode
explicitly to the SCSI mode after chip reset due to paranoia.
Re-arrange code so that SXFRCTL1 is restored as quickly after the
chip reset as possible.
S/G structurs must be 8byte aligned. Make this official by saying
so in our DMA tag.
Disable CIO bus stretch on MDFFSTAT if SHVALID is about to come
true. This can cause a CIO bus lockup if a PCI or PCI-X error
occurs while the stretch is occurring - the host cannot service
the PCI-X error since the CIO bus is locked out and SHVALID will
never resolve. The stretch was added in the Rev B to simplify the
wait for SHVALID to resolve, but the code to do this in the open
source sequencer is so simple it was never removed.
Consistently use MAX_OFFSET for the user max syncrate set from
non-volatile storage. This ensures that the offset does not
conflict with AH?_OFFSET_UNKNOWN.
Have ahd_pause_and_flushwork set the mode to ensure that it has
access to the registers it checks. Also modify the checking of
intstat so that the check against 0xFF can actually succeed if
the INT_PEND mask is something other than 0xFF. Although there
are no cardbus U320 controllers, this check may be needed to
recover from a hot-plug PCI removal that occurs without informing
the driver.
Fix a typo. sg_prefetch_cnt -> sg_prefetch_align. This fixes
an infinite loop at card initialization if the cacheline size is 0.
aic79xx.h:
Add AHD_EARLY_REQ_BUG bug flag.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
Change AH?_OFFSET_UNKNOWN to 0xFF. This is a value that the
curr->offset can never be, unlike '0' which we previously used.
This fixes code that only checks for a non-zero offset to
determine if a sync negotiation is required since it will fire
in the unknown case even if the goal is async.
aic79xx.reg:
Add comments for LQISTAT bits indicating their names in the 7902
data book. We use slightly different and more descriptive names
in the firmware.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
aic79xx.seq:
Update comments regarding rundown of the GSFIFO to reflect reality.
Fix spelling errors.
Since we use an 8byte address and 1 byte length, shorten the size
of a block move for the legacy DMA'ed CDB case from 11 to 9 bytes.
Remove code that, assuming the abort pending feature worked, would
set MK_MESSAGE in the SCB's control byte on completion to catch
invalid reselections. Since we don't see interrupts for completed
selections, this status update could occur prior to us noticing the
SELDO. The "select-out" queue logic will get confused by the
MK_MESSAGE bit being set as this is used to catch packatized
connections where we select-out with ATN. Since the abort pending
feature doesn't work on any released controllers yet, this code was
never executed.
Add support for the AHD_EARLY_REQ_BUG. Don't ignore persistent REQ
assertions just because they were asserted within the bus settle delay
window. This allows us to tolerate devices like the GEM318 that
violate the SCSI spec.
Remove unintentional settnig of SG_CACHE_AVAIL. Writing this bit
should have no effect, but who knows...
On the Rev A, we must wait for HDMAENACK before loading additional
segments to avoid clobbering the address of the first segment in
the S/G FIFO. This resolves data-corruption issues with certain
IBM (now Hitachi) and Fujitsu U320 drives.
Rearrange calc_residual to avoid an extra jmp instruction.
On RevA Silicon, if the target returns us to data-out after we
have already trained for data-out, it is possible for us to
transition the free running clock to data-valid before the required
100ns P1 setup time (8 P1 assertions in fast-160 mode). This will
only happen if this L-Q is a continuation of a data transfer for
which we have already prefetched data into our FIFO (LQ/Data
followed by LQ/Data for the same write transaction). This can
cause some target implementations to miss the first few data
transfers on the bus. We detect this situation by noticing that
this is the first data transfer after an LQ (LQIWORKONLQ true),
that the data transfer is a continuation of a transfer already
setup in our FIFO (SAVEPTRS interrupt), and that the transaction
is a write (DIRECTION set in DFCNTRL). The delay is performed by
disabling SCSIEN until we see the first REQ from the target.
Only compile in snapshot savepointers handler for RevA silicon
where it is enabled.
Handle the cfg4icmd packetized interrupt. We just need to load
the address and count, start the DMA, and CLRCHN once the transfer
is complete.
Fix an oversight in the overrun handler for packetized status
operations. We need to wait for either CTXTDONE or an overrun
when checking for an overrun. The previous code did not wait
and thus could decide that no overrun had occurred even though
an overrun will occur on the next data-valid req. Add some
comment to this section for clarity.
Use LAST_SEG_DONE instead of LASTSDONE for testing transfer
completion in the packetized status case. LASTSDONE may come up
more quickly since it only records completion on the SCSI side,
but since LAST_SEG_DONE is used everywhere else (and needs to be),
this is less confusing.
Add a missing invalidation of the longjmp address in the non-pack
handler. This code needs additional review.
aic79xx_inline.h:
Fix spelling error.
aic79xx_osm.c:
Set the cdb length for CDBs dma'ed from host memory.
Add a comment indicating that, should CAM start supporting cdbs
larger than 16bytes, the driver could store the CDB in the status
buffer.
aic79xx_pci.c:
Add a table entry for the 39320A.
Added a missing comma to an error string table.
Fix spelling errors.
2003-02-27 23:23:16 +00:00
|
|
|
field ENLQICRCI_LQ 0x10 /* LQICRCI1 */
|
|
|
|
field ENLQICRCI_NLQ 0x08 /* LQICRCI2 */
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENLQIBADLQI 0x04
|
aic79xx.c:
Clear the LQICRC_NLQ status should it pop up after we have
already handled the SCSIPERR. During some streaming operations
this status can be delayed until the stream ends. Without this
change, the driver would complain about a "Missing case in
ahd_handle_scsiint".
In the LQOBUSFREE handler...
Don't return the LQOMGR back to the idle state until after
we have cleaned up ENSELO and any status related to this
selection. The last thing we need is the LQO manager starting
another select-out before we have updated the execution queue.
It is not clear whether the LQOMGR would, or would not
start a new selection early.
Make sure ENSELO is off prior to clearing SELDO by flushing
device writes.
Move assignment of the next target SCB pointer inside of
an if to make the code clearer. The effect is the same.
Dump card state in both "Unexpected PKT busfree" paths.
In ahd_reset(), set the chip to SCSI mode before reading SXFRCTL1.
That register only exists in the SCSI mode. Also set the mode
explicitly to the SCSI mode after chip reset due to paranoia.
Re-arrange code so that SXFRCTL1 is restored as quickly after the
chip reset as possible.
S/G structurs must be 8byte aligned. Make this official by saying
so in our DMA tag.
Disable CIO bus stretch on MDFFSTAT if SHVALID is about to come
true. This can cause a CIO bus lockup if a PCI or PCI-X error
occurs while the stretch is occurring - the host cannot service
the PCI-X error since the CIO bus is locked out and SHVALID will
never resolve. The stretch was added in the Rev B to simplify the
wait for SHVALID to resolve, but the code to do this in the open
source sequencer is so simple it was never removed.
Consistently use MAX_OFFSET for the user max syncrate set from
non-volatile storage. This ensures that the offset does not
conflict with AH?_OFFSET_UNKNOWN.
Have ahd_pause_and_flushwork set the mode to ensure that it has
access to the registers it checks. Also modify the checking of
intstat so that the check against 0xFF can actually succeed if
the INT_PEND mask is something other than 0xFF. Although there
are no cardbus U320 controllers, this check may be needed to
recover from a hot-plug PCI removal that occurs without informing
the driver.
Fix a typo. sg_prefetch_cnt -> sg_prefetch_align. This fixes
an infinite loop at card initialization if the cacheline size is 0.
aic79xx.h:
Add AHD_EARLY_REQ_BUG bug flag.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
Change AH?_OFFSET_UNKNOWN to 0xFF. This is a value that the
curr->offset can never be, unlike '0' which we previously used.
This fixes code that only checks for a non-zero offset to
determine if a sync negotiation is required since it will fire
in the unknown case even if the goal is async.
aic79xx.reg:
Add comments for LQISTAT bits indicating their names in the 7902
data book. We use slightly different and more descriptive names
in the firmware.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
aic79xx.seq:
Update comments regarding rundown of the GSFIFO to reflect reality.
Fix spelling errors.
Since we use an 8byte address and 1 byte length, shorten the size
of a block move for the legacy DMA'ed CDB case from 11 to 9 bytes.
Remove code that, assuming the abort pending feature worked, would
set MK_MESSAGE in the SCB's control byte on completion to catch
invalid reselections. Since we don't see interrupts for completed
selections, this status update could occur prior to us noticing the
SELDO. The "select-out" queue logic will get confused by the
MK_MESSAGE bit being set as this is used to catch packatized
connections where we select-out with ATN. Since the abort pending
feature doesn't work on any released controllers yet, this code was
never executed.
Add support for the AHD_EARLY_REQ_BUG. Don't ignore persistent REQ
assertions just because they were asserted within the bus settle delay
window. This allows us to tolerate devices like the GEM318 that
violate the SCSI spec.
Remove unintentional settnig of SG_CACHE_AVAIL. Writing this bit
should have no effect, but who knows...
On the Rev A, we must wait for HDMAENACK before loading additional
segments to avoid clobbering the address of the first segment in
the S/G FIFO. This resolves data-corruption issues with certain
IBM (now Hitachi) and Fujitsu U320 drives.
Rearrange calc_residual to avoid an extra jmp instruction.
On RevA Silicon, if the target returns us to data-out after we
have already trained for data-out, it is possible for us to
transition the free running clock to data-valid before the required
100ns P1 setup time (8 P1 assertions in fast-160 mode). This will
only happen if this L-Q is a continuation of a data transfer for
which we have already prefetched data into our FIFO (LQ/Data
followed by LQ/Data for the same write transaction). This can
cause some target implementations to miss the first few data
transfers on the bus. We detect this situation by noticing that
this is the first data transfer after an LQ (LQIWORKONLQ true),
that the data transfer is a continuation of a transfer already
setup in our FIFO (SAVEPTRS interrupt), and that the transaction
is a write (DIRECTION set in DFCNTRL). The delay is performed by
disabling SCSIEN until we see the first REQ from the target.
Only compile in snapshot savepointers handler for RevA silicon
where it is enabled.
Handle the cfg4icmd packetized interrupt. We just need to load
the address and count, start the DMA, and CLRCHN once the transfer
is complete.
Fix an oversight in the overrun handler for packetized status
operations. We need to wait for either CTXTDONE or an overrun
when checking for an overrun. The previous code did not wait
and thus could decide that no overrun had occurred even though
an overrun will occur on the next data-valid req. Add some
comment to this section for clarity.
Use LAST_SEG_DONE instead of LASTSDONE for testing transfer
completion in the packetized status case. LASTSDONE may come up
more quickly since it only records completion on the SCSI side,
but since LAST_SEG_DONE is used everywhere else (and needs to be),
this is less confusing.
Add a missing invalidation of the longjmp address in the non-pack
handler. This code needs additional review.
aic79xx_inline.h:
Fix spelling error.
aic79xx_osm.c:
Set the cdb length for CDBs dma'ed from host memory.
Add a comment indicating that, should CAM start supporting cdbs
larger than 16bytes, the driver could store the CDB in the status
buffer.
aic79xx_pci.c:
Add a table entry for the 39320A.
Added a missing comma to an error string table.
Fix spelling errors.
2003-02-27 23:23:16 +00:00
|
|
|
field ENLQIOVERI_LQ 0x02 /* LQIOVERI1 */
|
|
|
|
field ENLQIOVERI_NLQ 0x01 /* LQIOVERI2 */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQI Manager Status 2
|
|
|
|
*/
|
|
|
|
register LQISTAT2 {
|
|
|
|
address 0x052
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field PACKETIZED 0x80
|
|
|
|
field LQIPHASE_OUTPKT 0x40
|
|
|
|
field LQIWORKONLQ 0x20
|
|
|
|
field LQIWAITFIFO 0x10
|
|
|
|
field LQISTOPPKT 0x08
|
|
|
|
field LQISTOPLQ 0x04
|
|
|
|
field LQISTOPCMD 0x02
|
|
|
|
field LQIGSAVAIL 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Status 3
|
|
|
|
*/
|
|
|
|
register SSTAT3 {
|
|
|
|
address 0x053
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field NTRAMPERR 0x02
|
|
|
|
field OSRAMPERR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear SCSI Status 3
|
|
|
|
*/
|
|
|
|
register CLRSINT3 {
|
|
|
|
address 0x053
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRNTRAMPERR 0x02
|
|
|
|
field CLROSRAMPERR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Interrupt Mode 3
|
|
|
|
*/
|
|
|
|
register SIMODE3 {
|
|
|
|
address 0x053
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENNTRAMPERR 0x02
|
|
|
|
field ENOSRAMPERR 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Status 0
|
|
|
|
*/
|
|
|
|
register LQOSTAT0 {
|
|
|
|
address 0x054
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQOTARGSCBPERR 0x10
|
|
|
|
field LQOSTOPT2 0x08
|
|
|
|
field LQOATNLQ 0x04
|
|
|
|
field LQOATNPKT 0x02
|
|
|
|
field LQOTCRC 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear LQO Manager interrupt 0
|
|
|
|
*/
|
|
|
|
register CLRLQOINT0 {
|
|
|
|
address 0x054
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRLQOTARGSCBPERR 0x10
|
|
|
|
field CLRLQOSTOPT2 0x08
|
|
|
|
field CLRLQOATNLQ 0x04
|
|
|
|
field CLRLQOATNPKT 0x02
|
|
|
|
field CLRLQOTCRC 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Interrupt Mode 0
|
|
|
|
*/
|
|
|
|
register LQOMODE0 {
|
|
|
|
address 0x054
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENLQOTARGSCBPERR 0x10
|
|
|
|
field ENLQOSTOPT2 0x08
|
|
|
|
field ENLQOATNLQ 0x04
|
|
|
|
field ENLQOATNPKT 0x02
|
|
|
|
field ENLQOTCRC 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Status 1
|
|
|
|
*/
|
|
|
|
register LQOSTAT1 {
|
|
|
|
address 0x055
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQOINITSCBPERR 0x10
|
|
|
|
field LQOSTOPI2 0x08
|
|
|
|
field LQOBADQAS 0x04
|
|
|
|
field LQOBUSFREE 0x02
|
|
|
|
field LQOPHACHGINPKT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear LOQ Interrupt 1
|
|
|
|
*/
|
|
|
|
register CLRLQOINT1 {
|
|
|
|
address 0x055
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRLQOINITSCBPERR 0x10
|
|
|
|
field CLRLQOSTOPI2 0x08
|
|
|
|
field CLRLQOBADQAS 0x04
|
|
|
|
field CLRLQOBUSFREE 0x02
|
|
|
|
field CLRLQOPHACHGINPKT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Interrupt Mode 1
|
|
|
|
*/
|
|
|
|
register LQOMODE1 {
|
|
|
|
address 0x055
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENLQOINITSCBPERR 0x10
|
|
|
|
field ENLQOSTOPI2 0x08
|
|
|
|
field ENLQOBADQAS 0x04
|
|
|
|
field ENLQOBUSFREE 0x02
|
|
|
|
field ENLQOPHACHGINPKT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LQO Manager Status 2
|
|
|
|
*/
|
|
|
|
register LQOSTAT2 {
|
|
|
|
address 0x056
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field LQOPKT 0xE0
|
|
|
|
field LQOWAITFIFO 0x10
|
|
|
|
field LQOPHACHGOUTPKT 0x02 /* outside of packet boundaries. */
|
|
|
|
field LQOSTOP0 0x01 /* Stopped after sending all packets */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Output Synchronizer Space Count
|
|
|
|
*/
|
|
|
|
register OS_SPACE_CNT {
|
|
|
|
address 0x056
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Interrupt Mode 1
|
|
|
|
* Setting any bit will enable the corresponding function
|
|
|
|
* in SIMODE1 to interrupt via the IRQ pin.
|
|
|
|
*/
|
|
|
|
register SIMODE1 {
|
|
|
|
address 0x057
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENSELTIMO 0x80
|
|
|
|
field ENATNTARG 0x40
|
|
|
|
field ENSCSIRST 0x20
|
|
|
|
field ENPHASEMIS 0x10
|
|
|
|
field ENBUSFREE 0x08
|
|
|
|
field ENSCSIPERR 0x04
|
|
|
|
field ENSTRB2FAST 0x02
|
|
|
|
field ENREQINIT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Good Status FIFO
|
|
|
|
*/
|
|
|
|
register GSFIFO {
|
|
|
|
address 0x058
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1, M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO SCSI Transfer Control
|
|
|
|
*/
|
|
|
|
register DFFSXFRCTL {
|
|
|
|
address 0x05A
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-12-01 08:13:37 +00:00
|
|
|
field DFFBITBUCKET 0x08
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRSHCNT 0x04
|
|
|
|
field CLRCHN 0x02
|
|
|
|
field RSTCHN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Next SCSI Control Block
|
|
|
|
*/
|
|
|
|
register NEXTSCB {
|
|
|
|
address 0x05A
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
2002-12-01 08:13:37 +00:00
|
|
|
|
|
|
|
/* Rev B only. */
|
|
|
|
register LQOSCSCTL {
|
|
|
|
address 0x05A
|
|
|
|
access_mode RW
|
|
|
|
size 1
|
|
|
|
modes M_CFG
|
|
|
|
field LQOH2A_VERSION 0x80
|
|
|
|
field LQONOCHKOVER 0x01
|
|
|
|
}
|
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* SEQ Interrupts
|
|
|
|
*/
|
|
|
|
register SEQINTSRC {
|
|
|
|
address 0x05B
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CTXTDONE 0x40
|
|
|
|
field SAVEPTRS 0x20
|
|
|
|
field CFG4DATA 0x10
|
|
|
|
field CFG4ISTAT 0x08
|
|
|
|
field CFG4TSTAT 0x04
|
|
|
|
field CFG4ICMD 0x02
|
|
|
|
field CFG4TCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Clear Arp Interrupts
|
|
|
|
*/
|
|
|
|
register CLRSEQINTSRC {
|
|
|
|
address 0x05B
|
|
|
|
access_mode WO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CLRCTXTDONE 0x40
|
|
|
|
field CLRSAVEPTRS 0x20
|
|
|
|
field CLRCFG4DATA 0x10
|
|
|
|
field CLRCFG4ISTAT 0x08
|
|
|
|
field CLRCFG4TSTAT 0x04
|
|
|
|
field CLRCFG4ICMD 0x02
|
|
|
|
field CLRCFG4TCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SEQ Interrupt Enabled (Shared)
|
|
|
|
*/
|
|
|
|
register SEQIMODE {
|
|
|
|
address 0x05C
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENCTXTDONE 0x40
|
|
|
|
field ENSAVEPTRS 0x20
|
|
|
|
field ENCFG4DATA 0x10
|
|
|
|
field ENCFG4ISTAT 0x08
|
|
|
|
field ENCFG4TSTAT 0x04
|
|
|
|
field ENCFG4ICMD 0x02
|
|
|
|
field ENCFG4TCMD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Current SCSI Control Block
|
|
|
|
*/
|
|
|
|
register CURRSCB {
|
|
|
|
address 0x05C
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Status
|
|
|
|
*/
|
|
|
|
register MDFFSTAT {
|
|
|
|
address 0x05D
|
|
|
|
access_mode RO
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field SHCNTNEGATIVE 0x40 /* Rev B or higher */
|
|
|
|
field SHCNTMINUS1 0x20 /* Rev B or higher */
|
|
|
|
field LASTSDONE 0x10
|
|
|
|
field SHVALID 0x08
|
|
|
|
field DLZERO 0x04 /* FIFO data ends on packet boundary. */
|
|
|
|
field DATAINFIFO 0x02
|
|
|
|
field FIFOFREE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CRC Control
|
|
|
|
*/
|
|
|
|
register CRCCONTROL {
|
|
|
|
address 0x05d
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field CRCVALCHKEN 0x40
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI Test Control
|
|
|
|
*/
|
|
|
|
register SCSITEST {
|
|
|
|
address 0x05E
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field CNTRTEST 0x08
|
|
|
|
field SEL_TXPLL_DEBUG 0x04
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Queue Tag
|
|
|
|
*/
|
|
|
|
register DFFTAG {
|
|
|
|
address 0x05E
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Last SCSI Control Block
|
|
|
|
*/
|
|
|
|
register LASTSCB {
|
|
|
|
address 0x05E
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCSI I/O Cell Power-down Control
|
|
|
|
*/
|
|
|
|
register IOPDNCTL {
|
|
|
|
address 0x05F
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field DISABLE_OE 0x80
|
|
|
|
field PDN_IDIST 0x04
|
|
|
|
field PDN_DIFFSENSE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Shaddow Host Address.
|
|
|
|
*/
|
|
|
|
register SHADDR {
|
|
|
|
address 0x060
|
|
|
|
access_mode RO
|
|
|
|
size 8
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Group CRC Interval.
|
|
|
|
*/
|
|
|
|
register DGRPCRCI {
|
|
|
|
address 0x060
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Transfer Negotiation Address
|
|
|
|
*/
|
|
|
|
register NEGOADDR {
|
|
|
|
address 0x060
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Transfer Negotiation Data - Period Byte
|
|
|
|
*/
|
|
|
|
register NEGPERIOD {
|
|
|
|
address 0x061
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Packetized CRC Interval
|
|
|
|
*/
|
|
|
|
register PACKCRCI {
|
|
|
|
address 0x062
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Transfer Negotiation Data - Offset Byte
|
|
|
|
*/
|
|
|
|
register NEGOFFSET {
|
|
|
|
address 0x062
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Transfer Negotiation Data - PPR Options
|
|
|
|
*/
|
|
|
|
register NEGPPROPTS {
|
|
|
|
address 0x063
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field PPROPT_PACE 0x08
|
|
|
|
field PPROPT_QAS 0x04
|
|
|
|
field PPROPT_DT 0x02
|
|
|
|
field PPROPT_IUT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data Transfer Negotiation Data - Connection Options
|
|
|
|
*/
|
|
|
|
register NEGCONOPTS {
|
|
|
|
address 0x064
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-12-01 08:13:37 +00:00
|
|
|
field ENSNAPSHOT 0x40
|
|
|
|
field RTI_WRTDIS 0x20
|
|
|
|
field RTI_OVRDTRN 0x10
|
|
|
|
field ENSLOWCRC 0x08
|
2002-08-31 06:49:11 +00:00
|
|
|
field ENAUTOATNI 0x04
|
|
|
|
field ENAUTOATNO 0x02
|
|
|
|
field WIDEXFER 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Negotiation Table Annex Column Index.
|
|
|
|
*/
|
|
|
|
register ANNEXCOL {
|
|
|
|
address 0x065
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
2002-08-31 06:49:11 +00:00
|
|
|
register SCSCHKN {
|
|
|
|
address 0x066
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
|
|
|
field STSELSKIDDIS 0x40
|
2002-12-01 08:13:37 +00:00
|
|
|
field CURRFIFODEF 0x20
|
2002-08-31 06:49:11 +00:00
|
|
|
field WIDERESEN 0x10
|
|
|
|
field SDONEMSKDIS 0x08
|
|
|
|
field DFFACTCLR 0x04
|
|
|
|
field SHVALIDSTDIS 0x02
|
|
|
|
field LSTSGCLRDIS 0x01
|
|
|
|
}
|
|
|
|
|
2002-12-01 08:13:37 +00:00
|
|
|
const AHD_ANNEXCOL_PER_DEV0 4
|
|
|
|
const AHD_NUM_PER_DEV_ANNEXCOLS 4
|
|
|
|
const AHD_ANNEXCOL_PRECOMP_SLEW 4
|
2002-06-05 19:52:45 +00:00
|
|
|
const AHD_PRECOMP_MASK 0x07
|
2002-12-01 08:13:37 +00:00
|
|
|
const AHD_PRECOMP_SHIFT 0
|
2002-06-05 19:52:45 +00:00
|
|
|
const AHD_PRECOMP_CUTBACK_17 0x04
|
|
|
|
const AHD_PRECOMP_CUTBACK_29 0x06
|
|
|
|
const AHD_PRECOMP_CUTBACK_37 0x07
|
2002-12-01 08:13:37 +00:00
|
|
|
const AHD_SLEWRATE_MASK 0x78
|
|
|
|
const AHD_SLEWRATE_SHIFT 3
|
|
|
|
/*
|
2003-03-25 22:16:27 +00:00
|
|
|
* Rev A has only a single bit (high bit of field) of slew adjustment.
|
|
|
|
* Rev B has 4 bits. The current default happens to be the same for both.
|
2002-12-01 08:13:37 +00:00
|
|
|
*/
|
2003-03-25 22:16:27 +00:00
|
|
|
const AHD_SLEWRATE_DEF_REVA 0x08
|
2002-12-01 08:13:37 +00:00
|
|
|
const AHD_SLEWRATE_DEF_REVB 0x08
|
|
|
|
|
|
|
|
/* Rev A does not have any amplitude setting. */
|
|
|
|
const AHD_ANNEXCOL_AMPLITUDE 6
|
|
|
|
const AHD_AMPLITUDE_MASK 0x7
|
|
|
|
const AHD_AMPLITUDE_SHIFT 0
|
|
|
|
const AHD_AMPLITUDE_DEF 0x7
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Negotiation Table Annex Data Port.
|
|
|
|
*/
|
|
|
|
register ANNEXDAT {
|
|
|
|
address 0x066
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Initiator's Own Id.
|
|
|
|
* The SCSI ID to use for Selection Out and seen during a reselection..
|
|
|
|
*/
|
|
|
|
register IOWNID {
|
|
|
|
address 0x067
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 960MHz Phase-Locked Loop Control 0
|
|
|
|
*/
|
|
|
|
register PLL960CTL0 {
|
|
|
|
address 0x068
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field PLL_VCOSEL 0x80
|
|
|
|
field PLL_PWDN 0x40
|
|
|
|
field PLL_NS 0x30
|
|
|
|
field PLL_ENLUD 0x08
|
|
|
|
field PLL_ENLPF 0x04
|
|
|
|
field PLL_DLPF 0x02
|
|
|
|
field PLL_ENFBM 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Target Own Id
|
|
|
|
*/
|
|
|
|
register TOWNID {
|
|
|
|
address 0x069
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 960MHz Phase-Locked Loop Control 1
|
|
|
|
*/
|
|
|
|
register PLL960CTL1 {
|
|
|
|
address 0x069
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field PLL_CNTEN 0x80
|
|
|
|
field PLL_CNTCLR 0x40
|
|
|
|
field PLL_RST 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Expander Signature
|
|
|
|
*/
|
|
|
|
register XSIG {
|
|
|
|
address 0x06A
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Shadow Byte Count
|
|
|
|
*/
|
|
|
|
register SHCNT {
|
|
|
|
address 0x068
|
|
|
|
access_mode RW
|
|
|
|
size 3
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Selection Out ID
|
|
|
|
*/
|
|
|
|
register SELOID {
|
|
|
|
address 0x06B
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 960-MHz Phase-Locked Loop Test Count
|
|
|
|
*/
|
|
|
|
register PLL960CNT0 {
|
|
|
|
address 0x06A
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 400-MHz Phase-Locked Loop Control 0
|
|
|
|
*/
|
|
|
|
register PLL400CTL0 {
|
|
|
|
address 0x06C
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field PLL_VCOSEL 0x80
|
|
|
|
field PLL_PWDN 0x40
|
|
|
|
field PLL_NS 0x30
|
|
|
|
field PLL_ENLUD 0x08
|
|
|
|
field PLL_ENLPF 0x04
|
|
|
|
field PLL_DLPF 0x02
|
|
|
|
field PLL_ENFBM 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Arbitration Fairness
|
|
|
|
*/
|
|
|
|
register FAIRNESS {
|
|
|
|
address 0x06C
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 400-MHz Phase-Locked Loop Control 1
|
|
|
|
*/
|
|
|
|
register PLL400CTL1 {
|
|
|
|
address 0x06D
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field PLL_CNTEN 0x80
|
|
|
|
field PLL_CNTCLR 0x40
|
|
|
|
field PLL_RST 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Arbitration Unfairness
|
|
|
|
*/
|
|
|
|
register UNFAIRNESS {
|
|
|
|
address 0x06E
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 400-MHz Phase-Locked Loop Test Count
|
|
|
|
*/
|
|
|
|
register PLL400CNT0 {
|
|
|
|
address 0x06E
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Page Pointer
|
|
|
|
*/
|
|
|
|
register SCBPTR {
|
|
|
|
address 0x0A8
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1, M_CCHAN, M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SCB Array Count
|
|
|
|
* Number of bytes to transfer between CMC SCB memory and SCBRAM.
|
|
|
|
* Transfers must be 8byte aligned and sized.
|
|
|
|
*/
|
|
|
|
register CCSCBACNT {
|
|
|
|
address 0x0AB
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Autopointer
|
|
|
|
* SCB-Next Address Snooping logic. When an SCB is transferred to
|
|
|
|
* the card, the next SCB address to be used by the CMC array can
|
|
|
|
* be autoloaded from that transfer.
|
|
|
|
*/
|
|
|
|
register SCBAUTOPTR {
|
|
|
|
address 0x0AB
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field AUSCBPTR_EN 0x80
|
|
|
|
field SCBPTR_ADDR 0x38
|
|
|
|
field SCBPTR_OFF 0x07
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SG Ram Address Pointer
|
|
|
|
*/
|
|
|
|
register CCSGADDR {
|
|
|
|
address 0x0AC
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SCB RAM Address Pointer
|
|
|
|
*/
|
|
|
|
register CCSCBADDR {
|
|
|
|
address 0x0AC
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SCB Ram Back-up Address Pointer
|
|
|
|
* Indicates the true stop location of transfers halted prior
|
|
|
|
* to SCBHCNT going to 0.
|
|
|
|
*/
|
|
|
|
register CCSCBADR_BK {
|
|
|
|
address 0x0AC
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SG Control
|
|
|
|
*/
|
|
|
|
register CCSGCTL {
|
|
|
|
address 0x0AD
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CCSGDONE 0x80
|
|
|
|
field SG_CACHE_AVAIL 0x10
|
2002-12-01 08:13:37 +00:00
|
|
|
field CCSGENACK 0x08
|
|
|
|
mask CCSGEN 0x0C
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_FETCH_REQ 0x02
|
|
|
|
field CCSGRESET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMD SCB Control
|
|
|
|
*/
|
|
|
|
register CCSCBCTL {
|
|
|
|
address 0x0AD
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
2002-08-31 06:49:11 +00:00
|
|
|
field CCSCBDONE 0x80
|
|
|
|
field ARRDONE 0x40
|
|
|
|
field CCARREN 0x10
|
|
|
|
field CCSCBEN 0x08
|
|
|
|
field CCSCBDIR 0x04
|
|
|
|
field CCSCBRESET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC Ram BIST
|
|
|
|
*/
|
|
|
|
register CMC_RAMBIST {
|
|
|
|
address 0x0AD
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_ELEMENT_SIZE 0x80
|
|
|
|
field SCBRAMBIST_FAIL 0x40
|
|
|
|
field SG_BIST_FAIL 0x20
|
|
|
|
field SG_BIST_EN 0x10
|
|
|
|
field CMC_BUFFER_BIST_FAIL 0x02
|
|
|
|
field CMC_BUFFER_BIST_EN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SG RAM Data Port
|
|
|
|
*/
|
|
|
|
register CCSGRAM {
|
|
|
|
address 0x0B0
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CMC SCB RAM Data Port
|
|
|
|
*/
|
|
|
|
register CCSCBRAM {
|
|
|
|
address 0x0B0
|
|
|
|
access_mode RW
|
|
|
|
modes M_CCHAN
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flex DMA Address.
|
|
|
|
*/
|
|
|
|
register FLEXADR {
|
|
|
|
address 0x0B0
|
|
|
|
access_mode RW
|
|
|
|
size 3
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flex DMA Byte Count
|
|
|
|
*/
|
|
|
|
register FLEXCNT {
|
|
|
|
address 0x0B3
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flex DMA Status
|
|
|
|
*/
|
|
|
|
register FLEXDMASTAT {
|
|
|
|
address 0x0B5
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field FLEXDMAERR 0x02
|
|
|
|
field FLEXDMADONE 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flex DMA Data Port
|
|
|
|
*/
|
|
|
|
register FLEXDATA {
|
|
|
|
address 0x0B6
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Board Data
|
|
|
|
*/
|
|
|
|
register BRDDAT {
|
|
|
|
address 0x0B8
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Board Control
|
|
|
|
*/
|
|
|
|
register BRDCTL {
|
|
|
|
address 0x0B9
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field FLXARBACK 0x80
|
|
|
|
field FLXARBREQ 0x40
|
|
|
|
field BRDADDR 0x38
|
|
|
|
field BRDEN 0x04
|
|
|
|
field BRDRW 0x02
|
|
|
|
field BRDSTB 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Serial EEPROM Address
|
|
|
|
*/
|
|
|
|
register SEEADR {
|
|
|
|
address 0x0BA
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Serial EEPROM Data
|
|
|
|
*/
|
|
|
|
register SEEDAT {
|
|
|
|
address 0x0BC
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Serial EEPROM Status
|
|
|
|
*/
|
|
|
|
register SEESTAT {
|
|
|
|
address 0x0BE
|
|
|
|
access_mode RO
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field INIT_DONE 0x80
|
|
|
|
field SEEOPCODE 0x70
|
|
|
|
field LDALTID_L 0x08
|
|
|
|
field SEEARBACK 0x04
|
|
|
|
field SEEBUSY 0x02
|
|
|
|
field SEESTART 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Serial EEPROM Control
|
|
|
|
*/
|
|
|
|
register SEECTL {
|
|
|
|
address 0x0BE
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
2002-08-31 06:49:11 +00:00
|
|
|
field SEEOPCODE 0x70 {
|
|
|
|
SEEOP_ERASE 0x70,
|
|
|
|
SEEOP_READ 0x60,
|
|
|
|
SEEOP_WRITE 0x50,
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* The following four commands use special
|
|
|
|
* addresses for differentiation.
|
|
|
|
*/
|
2002-08-31 06:49:11 +00:00
|
|
|
SEEOP_ERAL 0x40
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
mask SEEOP_EWEN 0x40
|
|
|
|
mask SEEOP_WALL 0x40
|
|
|
|
mask SEEOP_EWDS 0x40
|
2002-08-31 06:49:11 +00:00
|
|
|
field SEERST 0x02
|
|
|
|
field SEESTART 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const SEEOP_ERAL_ADDR 0x80
|
|
|
|
const SEEOP_EWEN_ADDR 0xC0
|
|
|
|
const SEEOP_WRAL_ADDR 0x40
|
|
|
|
const SEEOP_EWDS_ADDR 0x00
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SCB Counter
|
|
|
|
*/
|
|
|
|
register SCBCNT {
|
|
|
|
address 0x0BF
|
|
|
|
access_mode RW
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Write Address
|
|
|
|
* Pointer to the next QWD location to be written to the data FIFO.
|
|
|
|
*/
|
|
|
|
register DFWADDR {
|
|
|
|
address 0x0C0
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DSP Filter Control
|
|
|
|
*/
|
|
|
|
register DSPFLTRCTL {
|
|
|
|
address 0x0C0
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field FLTRDISABLE 0x20
|
|
|
|
field EDGESENSE 0x10
|
|
|
|
field DSPFCNTSEL 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DSP Data Channel Control
|
|
|
|
*/
|
|
|
|
register DSPDATACTL {
|
|
|
|
address 0x0C1
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field BYPASSENAB 0x80
|
|
|
|
field DESQDIS 0x10
|
|
|
|
field RCVROFFSTDIS 0x04
|
|
|
|
field XMITOFFSTDIS 0x02
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Read Address
|
|
|
|
* Pointer to the next QWD location to be read from the data FIFO.
|
|
|
|
*/
|
|
|
|
register DFRADDR {
|
|
|
|
address 0x0C2
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DSP REQ Control
|
|
|
|
*/
|
|
|
|
register DSPREQCTL {
|
|
|
|
address 0x0C2
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field MANREQCTL 0xC0
|
|
|
|
field MANREQDLY 0x3F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DSP ACK Control
|
|
|
|
*/
|
|
|
|
register DSPACKCTL {
|
|
|
|
address 0x0C3
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field MANACKCTL 0xC0
|
|
|
|
field MANACKDLY 0x3F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Data
|
|
|
|
* Read/Write byte port into the data FIFO. The read and write
|
|
|
|
* FIFO pointers increment with each read and write respectively
|
|
|
|
* to this port.
|
|
|
|
*/
|
|
|
|
register DFDAT {
|
|
|
|
address 0x0C4
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* DSP Channel Select
|
|
|
|
*/
|
|
|
|
register DSPSELECT {
|
|
|
|
address 0x0C4
|
|
|
|
access_mode RW
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field AUTOINCEN 0x80
|
|
|
|
field DSPSEL 0x1F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const NUMDSPS 0x14
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write Bias Control
|
|
|
|
*/
|
|
|
|
register WRTBIASCTL {
|
|
|
|
address 0x0C5
|
|
|
|
access_mode WO
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field AUTOXBCDIS 0x80
|
|
|
|
field XMITMANVAL 0x3F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
2002-12-01 08:13:37 +00:00
|
|
|
/*
|
|
|
|
* Currently the WRTBIASCTL is the same as the default.
|
|
|
|
*/
|
|
|
|
const WRTBIASCTL_HP_DEFAULT 0x0
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Receiver Bias Control
|
|
|
|
*/
|
|
|
|
register RCVRBIOSCTL {
|
|
|
|
address 0x0C6
|
|
|
|
access_mode WO
|
|
|
|
modes M_CFG
|
2002-08-31 06:49:11 +00:00
|
|
|
field AUTORBCDIS 0x80
|
|
|
|
field RCVRMANVAL 0x3F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write Bias Calculator
|
|
|
|
*/
|
|
|
|
register WRTBIASCALC {
|
|
|
|
address 0x0C7
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Pointers
|
|
|
|
* Contains the byte offset from DFWADDR and DWRADDR to the current
|
|
|
|
* FIFO write/read locations.
|
|
|
|
*/
|
|
|
|
register DFPTRS {
|
|
|
|
address 0x0C8
|
|
|
|
access_mode RW
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Receiver Bias Calculator
|
|
|
|
*/
|
|
|
|
register RCVRBIASCALC {
|
|
|
|
address 0x0C8
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Backup Read Pointer
|
|
|
|
* Contains the data FIFO address to be restored if the last
|
|
|
|
* data accessed from the data FIFO was not transferred successfully.
|
|
|
|
*/
|
|
|
|
register DFBKPTR {
|
|
|
|
address 0x0C9
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Skew Calculator
|
|
|
|
*/
|
|
|
|
register SKEWCALC {
|
|
|
|
address 0x0C9
|
|
|
|
access_mode RO
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
}
|
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Data FIFO Space Count
|
|
|
|
* Number of FIFO locations that are free.
|
|
|
|
*/
|
|
|
|
register DFSCNT {
|
|
|
|
address 0x0CC
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Data FIFO Byte Count
|
|
|
|
* Number of filled FIFO locations.
|
|
|
|
*/
|
|
|
|
register DFBCNT {
|
|
|
|
address 0x0CE
|
|
|
|
access_mode RO
|
|
|
|
size 2
|
|
|
|
modes M_DFF0, M_DFF1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Program Overlay Address.
|
|
|
|
* Low address must be written prior to high address.
|
|
|
|
*/
|
|
|
|
register OVLYADDR {
|
|
|
|
address 0x0D4
|
|
|
|
modes M_SCSI
|
|
|
|
size 2
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Control 0
|
|
|
|
* Error detection mode, speed configuration,
|
|
|
|
* single step, breakpoints and program load.
|
|
|
|
*/
|
|
|
|
register SEQCTL0 {
|
|
|
|
address 0x0D6
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field PERRORDIS 0x80
|
|
|
|
field PAUSEDIS 0x40
|
|
|
|
field FAILDIS 0x20
|
|
|
|
field FASTMODE 0x10
|
|
|
|
field BRKADRINTEN 0x08
|
|
|
|
field STEP 0x04
|
|
|
|
field SEQRESET 0x02
|
|
|
|
field LOADRAM 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Control 1
|
|
|
|
* Instruction RAM Diagnostics
|
|
|
|
*/
|
|
|
|
register SEQCTL1 {
|
|
|
|
address 0x0D7
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field OVRLAY_DATA_CHK 0x08
|
|
|
|
field RAMBIST_DONE 0x04
|
|
|
|
field RAMBIST_FAIL 0x02
|
|
|
|
field RAMBIST_EN 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Flags
|
|
|
|
* Zero and Carry state of the ALU.
|
|
|
|
*/
|
|
|
|
register FLAGS {
|
|
|
|
address 0x0D8
|
|
|
|
access_mode RO
|
2002-08-31 06:49:11 +00:00
|
|
|
field ZERO 0x02
|
|
|
|
field CARRY 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Interrupt Control
|
|
|
|
*/
|
|
|
|
register SEQINTCTL {
|
|
|
|
address 0x0D9
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field INTVEC1DSL 0x80
|
|
|
|
field INT1_CONTEXT 0x20
|
|
|
|
field SCS_SEQ_INT1M1 0x10
|
|
|
|
field SCS_SEQ_INT1M0 0x08
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
field INTMASK2 0x04
|
|
|
|
field INTMASK1 0x02
|
2002-08-31 06:49:11 +00:00
|
|
|
field IRET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer RAM Data Port
|
|
|
|
* Single byte window into the Sequencer Instruction Ram area starting
|
|
|
|
* at the address specified by OVLYADDR. To write a full instruction word,
|
|
|
|
* simply write four bytes in succession. OVLYADDR will increment after the
|
|
|
|
* most significant instrution byte (the byte with the parity bit) is written.
|
|
|
|
*/
|
|
|
|
register SEQRAM {
|
|
|
|
address 0x0DA
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequencer Program Counter
|
|
|
|
* Low byte must be written prior to high byte.
|
|
|
|
*/
|
|
|
|
register PRGMCNT {
|
|
|
|
address 0x0DE
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Accumulator
|
|
|
|
*/
|
|
|
|
register ACCUM {
|
|
|
|
address 0x0E0
|
|
|
|
access_mode RW
|
|
|
|
accumulator
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Source Index Register
|
|
|
|
* Incrementing index for reads of SINDIR and the destination (low byte only)
|
|
|
|
* for any immediate operands passed in jmp, jc, jnc, call instructions.
|
|
|
|
* Example:
|
|
|
|
* mvi 0xFF call some_routine;
|
|
|
|
*
|
|
|
|
* Will set SINDEX[0] to 0xFF and call the routine "some_routine.
|
|
|
|
*/
|
|
|
|
register SINDEX {
|
|
|
|
address 0x0E2
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
sindex
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Destination Index Register
|
|
|
|
* Incrementing index for writes to DINDIR. Can be used as a scratch register.
|
|
|
|
*/
|
|
|
|
register DINDEX {
|
|
|
|
address 0x0E4
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Break Address
|
|
|
|
* Sequencer instruction breakpoint address address.
|
|
|
|
*/
|
|
|
|
register BRKADDR0 {
|
|
|
|
address 0x0E6
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
register BRKADDR1 {
|
|
|
|
address 0x0E6
|
|
|
|
access_mode RW
|
2002-08-31 06:49:11 +00:00
|
|
|
field BRKDIS 0x80 /* Disable Breakpoint */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* All Ones
|
|
|
|
* All reads to this register return the value 0xFF.
|
|
|
|
*/
|
|
|
|
register ALLONES {
|
|
|
|
address 0x0E8
|
|
|
|
access_mode RO
|
|
|
|
allones
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* All Zeros
|
|
|
|
* All reads to this register return the value 0.
|
|
|
|
*/
|
|
|
|
register ALLZEROS {
|
|
|
|
address 0x0EA
|
|
|
|
access_mode RO
|
|
|
|
allzeros
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* No Destination
|
|
|
|
* Writes to this register have no effect.
|
|
|
|
*/
|
|
|
|
register NONE {
|
|
|
|
address 0x0EA
|
|
|
|
access_mode WO
|
|
|
|
none
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Source Index Indirect
|
|
|
|
* Reading this register is equivalent to reading (register_base + SINDEX) and
|
|
|
|
* incrementing SINDEX by 1.
|
|
|
|
*/
|
|
|
|
register SINDIR {
|
|
|
|
address 0x0EC
|
|
|
|
access_mode RO
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Destination Index Indirect
|
|
|
|
* Writing this register is equivalent to writing to (register_base + DINDEX)
|
|
|
|
* and incrementing DINDEX by 1.
|
|
|
|
*/
|
|
|
|
register DINDIR {
|
|
|
|
address 0x0ED
|
|
|
|
access_mode WO
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function One
|
|
|
|
* 2's complement to bit value conversion. Write the 2's complement value
|
|
|
|
* (0-7 only) to the top nibble and retrieve the bit indexed by that value
|
|
|
|
* on the next read of this register.
|
|
|
|
* Example:
|
|
|
|
* Write 0x60
|
|
|
|
* Read 0x40
|
|
|
|
*/
|
|
|
|
register FUNCTION1 {
|
|
|
|
address 0x0F0
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Stack
|
|
|
|
* Window into the stack. Each stack location is 10 bits wide reported
|
|
|
|
* low byte followed by high byte. There are 8 stack locations.
|
|
|
|
*/
|
|
|
|
register STACK {
|
|
|
|
address 0x0F2
|
|
|
|
access_mode RW
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Interrupt Vector 1 Address
|
|
|
|
* Interrupt branch address for SCS SEQ_INT1 mode 0 and 1 interrupts.
|
|
|
|
*/
|
|
|
|
register INTVEC1_ADDR {
|
|
|
|
address 0x0F4
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Current Address
|
|
|
|
* Address of the SEQRAM instruction currently executing instruction.
|
|
|
|
*/
|
|
|
|
register CURADDR {
|
|
|
|
address 0x0F4
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Interrupt Vector 2 Address
|
|
|
|
* Interrupt branch address for HST_SEQ_INT2 interrupts.
|
|
|
|
*/
|
|
|
|
register INTVEC2_ADDR {
|
|
|
|
address 0x0F6
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Last Address
|
|
|
|
* Address of the SEQRAM instruction executed prior to the current instruction.
|
|
|
|
*/
|
|
|
|
register LASTADDR {
|
|
|
|
address 0x0F6
|
|
|
|
access_mode RW
|
|
|
|
size 2
|
|
|
|
modes M_SCSI
|
|
|
|
}
|
|
|
|
|
|
|
|
register AHD_PCI_CONFIG_BASE {
|
|
|
|
address 0x100
|
|
|
|
access_mode RW
|
|
|
|
size 256
|
|
|
|
modes M_CFG
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------- Scratch RAM Offsets ------------------------- */
|
|
|
|
scratch_ram {
|
|
|
|
/* Mode Specific */
|
|
|
|
address 0x0A0
|
|
|
|
size 8
|
|
|
|
modes 0, 1, 2, 3
|
|
|
|
REG0 {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
REG1 {
|
|
|
|
size 2
|
|
|
|
}
|
2002-09-26 22:54:00 +00:00
|
|
|
REG_ISR {
|
2002-06-05 19:52:45 +00:00
|
|
|
size 2
|
|
|
|
}
|
|
|
|
SG_STATE {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field SEGS_AVAIL 0x01
|
|
|
|
field LOADING_NEEDED 0x02
|
|
|
|
field FETCH_INPROG 0x04
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Track whether the transfer byte count for
|
|
|
|
* the current data phase is odd.
|
|
|
|
*/
|
|
|
|
DATA_COUNT_ODD {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
scratch_ram {
|
|
|
|
/* Mode Specific */
|
|
|
|
address 0x0F8
|
|
|
|
size 8
|
|
|
|
modes 0, 1, 2, 3
|
|
|
|
LONGJMP_ADDR {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
ACCUM_SAVE {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
scratch_ram {
|
|
|
|
address 0x100
|
|
|
|
size 128
|
|
|
|
modes 0, 1, 2, 3
|
|
|
|
/*
|
|
|
|
* Per "other-id" execution queues. We use an array of
|
|
|
|
* tail pointers into lists of SCBs sorted by "other-id".
|
|
|
|
* The execution head pointer threads the head SCBs for
|
|
|
|
* each list.
|
|
|
|
*/
|
|
|
|
WAITING_SCB_TAILS {
|
|
|
|
size 32
|
|
|
|
}
|
|
|
|
WAITING_TID_HEAD {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
WAITING_TID_TAIL {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* SCBID of the next SCB in the new SCB queue.
|
|
|
|
*/
|
|
|
|
NEXT_QUEUED_SCB_ADDR {
|
|
|
|
size 4
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* head of list of SCBs that have
|
|
|
|
* completed but have not been
|
|
|
|
* put into the qoutfifo.
|
|
|
|
*/
|
|
|
|
COMPLETE_SCB_HEAD {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* The list of completed SCBs in
|
|
|
|
* the active DMA.
|
|
|
|
*/
|
|
|
|
COMPLETE_SCB_DMAINPROG_HEAD {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* head of list of SCBs that have
|
|
|
|
* completed but need to be uploaded
|
|
|
|
* to the host prior to being completed.
|
|
|
|
*/
|
|
|
|
COMPLETE_DMA_SCB_HEAD {
|
|
|
|
size 2
|
|
|
|
}
|
aic79xx.c:
aic79xx.seq:
Convert the COMPLETE_DMA_SCB list to an "stailq". This allows us to
safely keep the SCB that is currently being DMA'ed back the host on
the head of the list while processing completions off of the bus. The
newly completed SCBs are appended to the tail of the queue. In the
past, we just dequeued the SCB that was in flight from the list, but
this could result in a lost completion should the host perform certain
types of error recovery that must cancel all in-flight SCB DMA operations.
Switch from using a 16bit completion entry, holding just the tag and the
completion valid bit, to a 64bit completion entry that also contains a
"status packet valid" indicator. This solves two problems:
o The SCB DMA engine on at least Rev B. silicon does not properly deal
with a PCI disconnect that occurs at a non-64bit aligned offset in the
chips "source buffer". When the transfer is resumed, the DMA engine
continues at the correct offset, but may wrap to the head of the buffer
causing duplicate completions to be reported to the host. By using a
completion buffer in host memory that is 64bit aligned and using 64bit
completion entries, such disconnects should only occur at aligned addresses.
This assumes that the host bridge will only disconnect on cache-line
boundaries and that cache-lines are multpiles of 64bits.
o By embedding the status information in the completion entry we can avoid
an extra memory reference to the HSCB for commands that complete without
error.
Use the comparison of a "host freeze count" and a "sequencer freeze count"
to allow the host to process most SCBs that complete with non-zero status
without having to clear critical sections. Instead the host can just pause the
sequencer, performs any necessary cleanup in the waiting for selection list,
increments its freeze count on the controller, and unpauses. This is only
possible because the sequencer defers completions of SCBs with bad status
until after all pending selections have completed. The sequencer then avoids
referencing any data structures the host may touch during completion of the
SCB until the freeze counts match.
aic79xx.c:
Change the strategy for allocating our sentinal HSCB for the QINFIFO. In
the past, this allocation was tacked onto the QOUTFIFO allocation. Now that
the qoutfifo has grown to accomodate larger completion entries, the old
approach will result in a 64byte allocation that costs an extra page of
coherent memory. We now do this extra allocation via ahd_alloc_scbs()
where the "unused space" can be used to allocate "normal" HSCBs.
In our packetized busfree handler, use the ENSELO bit to differentiate
between packetized and non-packetized unexpected busfree events that
occur just after selection, but before the sequencer has had the oportunity
to service the selection.
When cleaning out the waiting for selection list, use the SCSI mode
instead of the command channel mode. The SCB pointer in the command
channel mode may be referenced by the SCB dma engine even while the
sequencer is paused, whereas the SCSI mode SCB pointer is only accessed
by the sequencer.
Print the "complete on qfreeze" sequencer SCB completion list in
ahd_dump_card_state(). This list holds all SCB completions that are deferred
until a pending select-out qfreeze event has taken effect.
aic79xx.h:
Add definitions and structures to handle the new SCB completion scheme.
Add a controller flag that indicates if the controller is in HostRAID
mode.
aic79xx.reg:
Remove macros used for toggling from one data fifo mode to the other.
They have not been in use for some time.
Add scratch ram fields for our new qfreeze count scheme, converting
the complete dma list into an "stailq", and providing for the "complete
on qfreeze" SCB completion list. Some other fields were moved to retain
proper field alignment (alignment >= field size in bytes).
aic79xx.seq:
Add code to our idle loop to:
o Process deferred completions once a qfreeze event has taken full
effect.
o Thaw the queue once the sequencer and host qfreeze counts match.
Generate 64bit completion entries passing the SCB_SGPTR field as the
"good status" indicator. The first bit in this field is only set if
we have a valid status packet to send to the host.
Convert the COMPLETE_DMA_SCB list to an "stailq".
When using "setjmp" to register an idle loop handler, do not combine
the "ret" with the block move to pop the stack address in the same
instruction. At least on the A, this results in a return to the setjmp
caller, not to the new address at the top of the stack. Since we want
the latter (we want the newly registered handler to only be invoked from
the idle loop), we must use a separate ret instruction.
Add a few missing critical sections.
Close a race condition that can occur on Rev A. silicon. If both FIFOs
happen to be allocated before the sequencer has a chance to service the
FIFO that was allocated first, we must take special care to service the
FIFO that is not active on the SCSI bus first. This guarantees that a
FIFO will be freed to handle any snapshot requests for the FIFO that is
still on the bus. Chosing the incorrect FIFO will result in deadlock.
Update comments.
aic79xx_inline.h
Correct the offset calculation for the syncing of our qoutfifo.
Update ahd_check_cmdcmpltqueues() for the larger completion entries.
aic79xx_pci.c:
Attach to HostRAID controllers by default. In the future I may add a
sysctl to modify the behavior, but since FreeBSD does not have any
HostRAID drivers, failing to attach just results in more email and
bug reports for the author.
MFC After: 1week
2004-02-04 16:38:38 +00:00
|
|
|
/*
|
|
|
|
* tail of list of SCBs that have
|
|
|
|
* completed but need to be uploaded
|
|
|
|
* to the host prior to being completed.
|
|
|
|
*/
|
|
|
|
COMPLETE_DMA_SCB_TAIL {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* head of list of SCBs that have
|
|
|
|
* been uploaded to the host, but cannot
|
|
|
|
* be completed until the QFREEZE is in
|
|
|
|
* full effect (i.e. no selections pending).
|
|
|
|
*/
|
|
|
|
COMPLETE_ON_QFREEZE_HEAD {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Counting semaphore to prevent new select-outs
|
|
|
|
* The queue is frozen so long as the sequencer
|
|
|
|
* and kernel freeze counts differ.
|
|
|
|
*/
|
2002-06-05 19:52:45 +00:00
|
|
|
QFREEZE_COUNT {
|
|
|
|
size 2
|
|
|
|
}
|
aic79xx.c:
aic79xx.seq:
Convert the COMPLETE_DMA_SCB list to an "stailq". This allows us to
safely keep the SCB that is currently being DMA'ed back the host on
the head of the list while processing completions off of the bus. The
newly completed SCBs are appended to the tail of the queue. In the
past, we just dequeued the SCB that was in flight from the list, but
this could result in a lost completion should the host perform certain
types of error recovery that must cancel all in-flight SCB DMA operations.
Switch from using a 16bit completion entry, holding just the tag and the
completion valid bit, to a 64bit completion entry that also contains a
"status packet valid" indicator. This solves two problems:
o The SCB DMA engine on at least Rev B. silicon does not properly deal
with a PCI disconnect that occurs at a non-64bit aligned offset in the
chips "source buffer". When the transfer is resumed, the DMA engine
continues at the correct offset, but may wrap to the head of the buffer
causing duplicate completions to be reported to the host. By using a
completion buffer in host memory that is 64bit aligned and using 64bit
completion entries, such disconnects should only occur at aligned addresses.
This assumes that the host bridge will only disconnect on cache-line
boundaries and that cache-lines are multpiles of 64bits.
o By embedding the status information in the completion entry we can avoid
an extra memory reference to the HSCB for commands that complete without
error.
Use the comparison of a "host freeze count" and a "sequencer freeze count"
to allow the host to process most SCBs that complete with non-zero status
without having to clear critical sections. Instead the host can just pause the
sequencer, performs any necessary cleanup in the waiting for selection list,
increments its freeze count on the controller, and unpauses. This is only
possible because the sequencer defers completions of SCBs with bad status
until after all pending selections have completed. The sequencer then avoids
referencing any data structures the host may touch during completion of the
SCB until the freeze counts match.
aic79xx.c:
Change the strategy for allocating our sentinal HSCB for the QINFIFO. In
the past, this allocation was tacked onto the QOUTFIFO allocation. Now that
the qoutfifo has grown to accomodate larger completion entries, the old
approach will result in a 64byte allocation that costs an extra page of
coherent memory. We now do this extra allocation via ahd_alloc_scbs()
where the "unused space" can be used to allocate "normal" HSCBs.
In our packetized busfree handler, use the ENSELO bit to differentiate
between packetized and non-packetized unexpected busfree events that
occur just after selection, but before the sequencer has had the oportunity
to service the selection.
When cleaning out the waiting for selection list, use the SCSI mode
instead of the command channel mode. The SCB pointer in the command
channel mode may be referenced by the SCB dma engine even while the
sequencer is paused, whereas the SCSI mode SCB pointer is only accessed
by the sequencer.
Print the "complete on qfreeze" sequencer SCB completion list in
ahd_dump_card_state(). This list holds all SCB completions that are deferred
until a pending select-out qfreeze event has taken effect.
aic79xx.h:
Add definitions and structures to handle the new SCB completion scheme.
Add a controller flag that indicates if the controller is in HostRAID
mode.
aic79xx.reg:
Remove macros used for toggling from one data fifo mode to the other.
They have not been in use for some time.
Add scratch ram fields for our new qfreeze count scheme, converting
the complete dma list into an "stailq", and providing for the "complete
on qfreeze" SCB completion list. Some other fields were moved to retain
proper field alignment (alignment >= field size in bytes).
aic79xx.seq:
Add code to our idle loop to:
o Process deferred completions once a qfreeze event has taken full
effect.
o Thaw the queue once the sequencer and host qfreeze counts match.
Generate 64bit completion entries passing the SCB_SGPTR field as the
"good status" indicator. The first bit in this field is only set if
we have a valid status packet to send to the host.
Convert the COMPLETE_DMA_SCB list to an "stailq".
When using "setjmp" to register an idle loop handler, do not combine
the "ret" with the block move to pop the stack address in the same
instruction. At least on the A, this results in a return to the setjmp
caller, not to the new address at the top of the stack. Since we want
the latter (we want the newly registered handler to only be invoked from
the idle loop), we must use a separate ret instruction.
Add a few missing critical sections.
Close a race condition that can occur on Rev A. silicon. If both FIFOs
happen to be allocated before the sequencer has a chance to service the
FIFO that was allocated first, we must take special care to service the
FIFO that is not active on the SCSI bus first. This guarantees that a
FIFO will be freed to handle any snapshot requests for the FIFO that is
still on the bus. Chosing the incorrect FIFO will result in deadlock.
Update comments.
aic79xx_inline.h
Correct the offset calculation for the syncing of our qoutfifo.
Update ahd_check_cmdcmpltqueues() for the larger completion entries.
aic79xx_pci.c:
Attach to HostRAID controllers by default. In the future I may add a
sysctl to modify the behavior, but since FreeBSD does not have any
HostRAID drivers, failing to attach just results in more email and
bug reports for the author.
MFC After: 1week
2004-02-04 16:38:38 +00:00
|
|
|
KERNEL_QFREEZE_COUNT {
|
|
|
|
size 2
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
2002-12-01 08:13:37 +00:00
|
|
|
* Mode to restore on legacy idle loop exit.
|
2002-06-05 19:52:45 +00:00
|
|
|
*/
|
|
|
|
SAVED_MODE {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Single byte buffer used to designate the type or message
|
|
|
|
* to send to a target.
|
|
|
|
*/
|
|
|
|
MSG_OUT {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
/* Parameters for DMA Logic */
|
|
|
|
DMAPARAMS {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field PRELOADEN 0x80
|
|
|
|
field WIDEODD 0x40
|
|
|
|
field SCSIEN 0x20
|
|
|
|
field SDMAEN 0x10
|
|
|
|
field SDMAENACK 0x10
|
|
|
|
field HDMAEN 0x08
|
|
|
|
field HDMAENACK 0x08
|
|
|
|
field DIRECTION 0x04 /* Set indicates PCI->SCSI */
|
|
|
|
field FIFOFLUSH 0x02
|
|
|
|
field FIFORESET 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SEQ_FLAGS {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field NOT_IDENTIFIED 0x80
|
|
|
|
field NO_CDB_SENT 0x40
|
2002-09-26 22:54:00 +00:00
|
|
|
field TARGET_CMD_IS_TAGGED 0x40
|
2002-08-31 06:49:11 +00:00
|
|
|
field DPHASE 0x20
|
2002-06-05 19:52:45 +00:00
|
|
|
/* Target flags */
|
2002-08-31 06:49:11 +00:00
|
|
|
field TARG_CMD_PENDING 0x10
|
|
|
|
field CMDPHASE_PENDING 0x08
|
|
|
|
field DPHASE_PENDING 0x04
|
|
|
|
field SPHASE_PENDING 0x02
|
|
|
|
field NO_DISCONNECT 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Temporary storage for the
|
|
|
|
* target/channel/lun of a
|
|
|
|
* reconnecting target
|
|
|
|
*/
|
|
|
|
SAVED_SCSIID {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
SAVED_LUN {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* The last bus phase as seen by the sequencer.
|
|
|
|
*/
|
|
|
|
LASTPHASE {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field CDI 0x80
|
|
|
|
field IOI 0x40
|
|
|
|
field MSGI 0x20
|
2002-09-26 22:54:00 +00:00
|
|
|
field P_BUSFREE 0x01
|
2002-08-31 06:49:11 +00:00
|
|
|
enum PHASE_MASK CDO|IOO|MSGO {
|
|
|
|
P_DATAOUT 0x0,
|
|
|
|
P_DATAIN IOO,
|
|
|
|
P_DATAOUT_DT P_DATAOUT|MSGO,
|
|
|
|
P_DATAIN_DT P_DATAIN|MSGO,
|
|
|
|
P_COMMAND CDO,
|
|
|
|
P_MESGOUT CDO|MSGO,
|
|
|
|
P_STATUS CDO|IOO,
|
2002-09-26 22:54:00 +00:00
|
|
|
P_MESGIN CDO|IOO|MSGO
|
2002-08-31 06:49:11 +00:00
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
2002-12-01 08:13:37 +00:00
|
|
|
/*
|
|
|
|
* Value to "or" into the SCBPTR[1] value to
|
|
|
|
* indicate that an entry in the QINFIFO is valid.
|
|
|
|
*/
|
|
|
|
QOUTFIFO_ENTRY_VALID_TAG {
|
|
|
|
size 1
|
|
|
|
}
|
aic79xx.c:
aic79xx.seq:
Convert the COMPLETE_DMA_SCB list to an "stailq". This allows us to
safely keep the SCB that is currently being DMA'ed back the host on
the head of the list while processing completions off of the bus. The
newly completed SCBs are appended to the tail of the queue. In the
past, we just dequeued the SCB that was in flight from the list, but
this could result in a lost completion should the host perform certain
types of error recovery that must cancel all in-flight SCB DMA operations.
Switch from using a 16bit completion entry, holding just the tag and the
completion valid bit, to a 64bit completion entry that also contains a
"status packet valid" indicator. This solves two problems:
o The SCB DMA engine on at least Rev B. silicon does not properly deal
with a PCI disconnect that occurs at a non-64bit aligned offset in the
chips "source buffer". When the transfer is resumed, the DMA engine
continues at the correct offset, but may wrap to the head of the buffer
causing duplicate completions to be reported to the host. By using a
completion buffer in host memory that is 64bit aligned and using 64bit
completion entries, such disconnects should only occur at aligned addresses.
This assumes that the host bridge will only disconnect on cache-line
boundaries and that cache-lines are multpiles of 64bits.
o By embedding the status information in the completion entry we can avoid
an extra memory reference to the HSCB for commands that complete without
error.
Use the comparison of a "host freeze count" and a "sequencer freeze count"
to allow the host to process most SCBs that complete with non-zero status
without having to clear critical sections. Instead the host can just pause the
sequencer, performs any necessary cleanup in the waiting for selection list,
increments its freeze count on the controller, and unpauses. This is only
possible because the sequencer defers completions of SCBs with bad status
until after all pending selections have completed. The sequencer then avoids
referencing any data structures the host may touch during completion of the
SCB until the freeze counts match.
aic79xx.c:
Change the strategy for allocating our sentinal HSCB for the QINFIFO. In
the past, this allocation was tacked onto the QOUTFIFO allocation. Now that
the qoutfifo has grown to accomodate larger completion entries, the old
approach will result in a 64byte allocation that costs an extra page of
coherent memory. We now do this extra allocation via ahd_alloc_scbs()
where the "unused space" can be used to allocate "normal" HSCBs.
In our packetized busfree handler, use the ENSELO bit to differentiate
between packetized and non-packetized unexpected busfree events that
occur just after selection, but before the sequencer has had the oportunity
to service the selection.
When cleaning out the waiting for selection list, use the SCSI mode
instead of the command channel mode. The SCB pointer in the command
channel mode may be referenced by the SCB dma engine even while the
sequencer is paused, whereas the SCSI mode SCB pointer is only accessed
by the sequencer.
Print the "complete on qfreeze" sequencer SCB completion list in
ahd_dump_card_state(). This list holds all SCB completions that are deferred
until a pending select-out qfreeze event has taken effect.
aic79xx.h:
Add definitions and structures to handle the new SCB completion scheme.
Add a controller flag that indicates if the controller is in HostRAID
mode.
aic79xx.reg:
Remove macros used for toggling from one data fifo mode to the other.
They have not been in use for some time.
Add scratch ram fields for our new qfreeze count scheme, converting
the complete dma list into an "stailq", and providing for the "complete
on qfreeze" SCB completion list. Some other fields were moved to retain
proper field alignment (alignment >= field size in bytes).
aic79xx.seq:
Add code to our idle loop to:
o Process deferred completions once a qfreeze event has taken full
effect.
o Thaw the queue once the sequencer and host qfreeze counts match.
Generate 64bit completion entries passing the SCB_SGPTR field as the
"good status" indicator. The first bit in this field is only set if
we have a valid status packet to send to the host.
Convert the COMPLETE_DMA_SCB list to an "stailq".
When using "setjmp" to register an idle loop handler, do not combine
the "ret" with the block move to pop the stack address in the same
instruction. At least on the A, this results in a return to the setjmp
caller, not to the new address at the top of the stack. Since we want
the latter (we want the newly registered handler to only be invoked from
the idle loop), we must use a separate ret instruction.
Add a few missing critical sections.
Close a race condition that can occur on Rev A. silicon. If both FIFOs
happen to be allocated before the sequencer has a chance to service the
FIFO that was allocated first, we must take special care to service the
FIFO that is not active on the SCSI bus first. This guarantees that a
FIFO will be freed to handle any snapshot requests for the FIFO that is
still on the bus. Chosing the incorrect FIFO will result in deadlock.
Update comments.
aic79xx_inline.h
Correct the offset calculation for the syncing of our qoutfifo.
Update ahd_check_cmdcmpltqueues() for the larger completion entries.
aic79xx_pci.c:
Attach to HostRAID controllers by default. In the future I may add a
sysctl to modify the behavior, but since FreeBSD does not have any
HostRAID drivers, failing to attach just results in more email and
bug reports for the author.
MFC After: 1week
2004-02-04 16:38:38 +00:00
|
|
|
/*
|
|
|
|
* Kernel and sequencer offsets into the queue of
|
|
|
|
* incoming target mode command descriptors. The
|
|
|
|
* queue is full when the KERNEL_TQINPOS == TQINPOS.
|
|
|
|
*/
|
|
|
|
KERNEL_TQINPOS {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
TQINPOS {
|
|
|
|
size 1
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Base address of our shared data with the kernel driver in host
|
|
|
|
* memory. This includes the qoutfifo and target mode
|
|
|
|
* incoming command queue.
|
|
|
|
*/
|
|
|
|
SHARED_DATA_ADDR {
|
|
|
|
size 4
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Pointer to location in host memory for next
|
|
|
|
* position in the qoutfifo.
|
|
|
|
*/
|
|
|
|
QOUTFIFO_NEXT_ADDR {
|
|
|
|
size 4
|
|
|
|
}
|
|
|
|
ARG_1 {
|
|
|
|
size 1
|
|
|
|
mask SEND_MSG 0x80
|
|
|
|
mask SEND_SENSE 0x40
|
|
|
|
mask SEND_REJ 0x20
|
|
|
|
mask MSGOUT_PHASEMIS 0x10
|
|
|
|
mask EXIT_MSG_LOOP 0x08
|
|
|
|
mask CONT_MSG_LOOP_WRITE 0x04
|
|
|
|
mask CONT_MSG_LOOP_READ 0x03
|
|
|
|
mask CONT_MSG_LOOP_TARG 0x02
|
|
|
|
alias RETURN_1
|
|
|
|
}
|
|
|
|
ARG_2 {
|
|
|
|
size 1
|
|
|
|
alias RETURN_2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Snapshot of MSG_OUT taken after each message is sent.
|
|
|
|
*/
|
|
|
|
LAST_MSG {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sequences the kernel driver has okayed for us. This allows
|
|
|
|
* the driver to do things like prevent initiator or target
|
|
|
|
* operations.
|
|
|
|
*/
|
|
|
|
SCSISEQ_TEMPLATE {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field MANUALCTL 0x40
|
|
|
|
field ENSELI 0x20
|
|
|
|
field ENRSELI 0x10
|
|
|
|
field MANUALP 0x0C
|
|
|
|
field ENAUTOATNP 0x02
|
|
|
|
field ALTSTIM 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The initiator specified tag for this target mode transaction.
|
|
|
|
*/
|
|
|
|
INITIATOR_TAG {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
|
|
|
|
SEQ_FLAGS2 {
|
|
|
|
size 1
|
Correct a very rare case where command ordering could be compromised
by a transaction performing a driver handled message sequence (an
scb with the MK_MESSAGE flag set).
SCBs that perform host managed messaging must always be
at the head of their per-target selection queue so that
the firmware knows to manually assert ATN if the current
negotiation agreement is packetized. In the past we
guaranteed this by queuing these SCBs separarately in
the execution queue. This exposes the system to potential
command reordering in two cases:
1) Another SCB for the same ITL nexus is queued that does
not have the MK_MESSAGE flag set. This SCB will be
queued to the per-target list which can be serviced
before the MK_MESSAGE scb that preceeded it.
2) If the target cannot accept all of the commands in the
per-target selection queue in one selection, the remainder
is queued to the tail of the selection queues so as to
effect round-robin scheduling. This could allow the
MK_MESSAGE scb to be sent to the target before the
requeued commands.
This commit changes the firmware policy to defer queuing
MK_MESSAGE SCBs into the selection queues until this can
be done without affecting order. This means that the
target's selection queue is either empty, or the last
SCB on the execution queue is also a MK_MESSAGE SCB.
During any wait, the firmware halts the download of new
SCBs so only a single "holding location" is required.
Luckily, MK_MESSAGE SCBs are rare and typically occur only
during CAM's bus probe where only one command is outstanding
at a time. However, during some recovery scenarios, the
reordering *could* occur.
aic79xx.c:
Update ahd_search_qinfifo() and helper routines to
search for pending MK_MESSAGE scbs and properly
restitch the execution queue if either the MK_MESSAGE
SCB is being aborted, or the MK_MESSAGE SCB can be
queued due to the execution queue draining due to
aborts.
Enable LQOBUSFREE status to assert an interrupt.
This should be redundant since a BUSFREE interrupt
should always occur along with an LQOBUSFREE event,
but on the Rev A, this doesn't seem to be guaranteed.
When a PPR request is rejected when a previously
existing packetized agreement is in place, assume
that the target has been reset without our knowledge
and revert to async/narrow transfers. This corrects
two issues: the stale ENATNO setting that was used
to send the PPR is cleared so the firmware is not
confused by a future packetized selection with
ATN asserted but no MK_MESSAGE flag in the SCB and
it speeds up recovery by aborting any pending
packetized transactions that by definition are now
dead.
When re-queueing SCBs after a failed negotiation
attempt, ensure command ordering by freezing the
device queue first.
Traverse the list of pending SCBs rather than the
whole SCB array on the controller when pushing
MK_MESSAGE flag changes out to the controller.
The original code was optimized for the aic7xxx
controllers where there are fewer controller slots
then pending SCBs and the firmware picks SCB
slots. For the U320 controller, the hope is
that we have fewer pending SCBs then the 512
slots on the controller.
Enhance some diagnostics.
Factor out some common code.
aic79xx.h:
Add prototype for new ahd_done_with_status() that is
used to factor out some commone code.
aic79xx.reg:
Add definisions for the pending MK_MESSAGE SCB.
aic79xx.seq:
Defer MK_MESSAGE SCB queing to the execution queue
so as to preserve command ordering. Re-arrange some
of the selection processing code so the above change
had no performance impact on the common code path.
Close a few critical section holes.
When entering a non-packetized phase, manually enable
busfree interrupts, since the controller hardware
does not do this automatically.
aic79xx_inline.h:
Enhance logging for queued SCBs.
aic79xx_osm.c:
Add new a new DDB ahd command, ahd_dump, which
invokes the ahd_dump_card_state() routine on the
unit specified with the ahd_sunit DDB command.
aic79xx_pci.c:
Turn on the BUSFREEREV bug for the Rev B. controller.
This is required to close the busfree during non-packetized
phase hole.
2004-08-04 17:55:34 +00:00
|
|
|
field PENDING_MK_MESSAGE 0x01
|
|
|
|
field TARGET_MSG_PENDING 0x02
|
|
|
|
field SELECTOUT_QFROZEN 0x04
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
2002-09-26 22:54:00 +00:00
|
|
|
|
|
|
|
ALLOCFIFO_SCBPTR {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
/*
|
2003-05-26 21:10:58 +00:00
|
|
|
* The maximum amount of time to wait, when interrupt coalescing
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
* is enabled, before issueing a CMDCMPLT interrupt for a completed
|
|
|
|
* command.
|
|
|
|
*/
|
2003-05-26 21:10:58 +00:00
|
|
|
INT_COALESCING_TIMER {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2003-05-26 21:10:58 +00:00
|
|
|
* The maximum number of commands to coalesce into a single interrupt.
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
* Actually the 2's complement of that value to simplify sequencer
|
|
|
|
* code.
|
|
|
|
*/
|
2003-05-26 21:10:58 +00:00
|
|
|
INT_COALESCING_MAXCMDS {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
size 1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The minimum number of commands still outstanding required
|
2003-05-26 21:10:58 +00:00
|
|
|
* to continue coalescing (2's complement of value).
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
*/
|
2003-05-26 21:10:58 +00:00
|
|
|
INT_COALESCING_MINCMDS {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
size 1
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Number of commands "in-flight".
|
|
|
|
*/
|
|
|
|
CMDS_PENDING {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2003-05-26 21:10:58 +00:00
|
|
|
* The count of commands that have been coalesced.
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
*/
|
2003-05-26 21:10:58 +00:00
|
|
|
INT_COALESCING_CMDCOUNT {
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
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
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Target-mode CDB type to CDB length table used
|
|
|
|
* in non-packetized operation.
|
|
|
|
*/
|
|
|
|
CMDSIZE_TABLE {
|
|
|
|
size 8
|
|
|
|
}
|
Correct a very rare case where command ordering could be compromised
by a transaction performing a driver handled message sequence (an
scb with the MK_MESSAGE flag set).
SCBs that perform host managed messaging must always be
at the head of their per-target selection queue so that
the firmware knows to manually assert ATN if the current
negotiation agreement is packetized. In the past we
guaranteed this by queuing these SCBs separarately in
the execution queue. This exposes the system to potential
command reordering in two cases:
1) Another SCB for the same ITL nexus is queued that does
not have the MK_MESSAGE flag set. This SCB will be
queued to the per-target list which can be serviced
before the MK_MESSAGE scb that preceeded it.
2) If the target cannot accept all of the commands in the
per-target selection queue in one selection, the remainder
is queued to the tail of the selection queues so as to
effect round-robin scheduling. This could allow the
MK_MESSAGE scb to be sent to the target before the
requeued commands.
This commit changes the firmware policy to defer queuing
MK_MESSAGE SCBs into the selection queues until this can
be done without affecting order. This means that the
target's selection queue is either empty, or the last
SCB on the execution queue is also a MK_MESSAGE SCB.
During any wait, the firmware halts the download of new
SCBs so only a single "holding location" is required.
Luckily, MK_MESSAGE SCBs are rare and typically occur only
during CAM's bus probe where only one command is outstanding
at a time. However, during some recovery scenarios, the
reordering *could* occur.
aic79xx.c:
Update ahd_search_qinfifo() and helper routines to
search for pending MK_MESSAGE scbs and properly
restitch the execution queue if either the MK_MESSAGE
SCB is being aborted, or the MK_MESSAGE SCB can be
queued due to the execution queue draining due to
aborts.
Enable LQOBUSFREE status to assert an interrupt.
This should be redundant since a BUSFREE interrupt
should always occur along with an LQOBUSFREE event,
but on the Rev A, this doesn't seem to be guaranteed.
When a PPR request is rejected when a previously
existing packetized agreement is in place, assume
that the target has been reset without our knowledge
and revert to async/narrow transfers. This corrects
two issues: the stale ENATNO setting that was used
to send the PPR is cleared so the firmware is not
confused by a future packetized selection with
ATN asserted but no MK_MESSAGE flag in the SCB and
it speeds up recovery by aborting any pending
packetized transactions that by definition are now
dead.
When re-queueing SCBs after a failed negotiation
attempt, ensure command ordering by freezing the
device queue first.
Traverse the list of pending SCBs rather than the
whole SCB array on the controller when pushing
MK_MESSAGE flag changes out to the controller.
The original code was optimized for the aic7xxx
controllers where there are fewer controller slots
then pending SCBs and the firmware picks SCB
slots. For the U320 controller, the hope is
that we have fewer pending SCBs then the 512
slots on the controller.
Enhance some diagnostics.
Factor out some common code.
aic79xx.h:
Add prototype for new ahd_done_with_status() that is
used to factor out some commone code.
aic79xx.reg:
Add definisions for the pending MK_MESSAGE SCB.
aic79xx.seq:
Defer MK_MESSAGE SCB queing to the execution queue
so as to preserve command ordering. Re-arrange some
of the selection processing code so the above change
had no performance impact on the common code path.
Close a few critical section holes.
When entering a non-packetized phase, manually enable
busfree interrupts, since the controller hardware
does not do this automatically.
aic79xx_inline.h:
Enhance logging for queued SCBs.
aic79xx_osm.c:
Add new a new DDB ahd command, ahd_dump, which
invokes the ahd_dump_card_state() routine on the
unit specified with the ahd_sunit DDB command.
aic79xx_pci.c:
Turn on the BUSFREEREV bug for the Rev B. controller.
This is required to close the busfree during non-packetized
phase hole.
2004-08-04 17:55:34 +00:00
|
|
|
/*
|
|
|
|
* When an SCB with the MK_MESSAGE flag is
|
|
|
|
* queued to the controller, it cannot enter
|
|
|
|
* the waiting for selection list until the
|
|
|
|
* selections for any previously queued
|
|
|
|
* commands to that target complete. During
|
|
|
|
* the wait, the MK_MESSAGE SCB is queued
|
|
|
|
* here.
|
|
|
|
*/
|
|
|
|
MK_MESSAGE_SCB {
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Saved SCSIID of MK_MESSAGE_SCB to avoid
|
|
|
|
* an extra SCBPTR operation when deciding
|
|
|
|
* if the MK_MESSAGE_SCB can be run.
|
|
|
|
*/
|
|
|
|
MK_MESSAGE_SCSIID {
|
|
|
|
size 1
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/************************* Hardware SCB Definition ****************************/
|
|
|
|
scb {
|
|
|
|
address 0x180
|
|
|
|
size 64
|
|
|
|
modes 0, 1, 2, 3
|
|
|
|
SCB_RESIDUAL_DATACNT {
|
|
|
|
size 4
|
|
|
|
alias SCB_CDB_STORE
|
aic79xx.c:
Clear the LQICRC_NLQ status should it pop up after we have
already handled the SCSIPERR. During some streaming operations
this status can be delayed until the stream ends. Without this
change, the driver would complain about a "Missing case in
ahd_handle_scsiint".
In the LQOBUSFREE handler...
Don't return the LQOMGR back to the idle state until after
we have cleaned up ENSELO and any status related to this
selection. The last thing we need is the LQO manager starting
another select-out before we have updated the execution queue.
It is not clear whether the LQOMGR would, or would not
start a new selection early.
Make sure ENSELO is off prior to clearing SELDO by flushing
device writes.
Move assignment of the next target SCB pointer inside of
an if to make the code clearer. The effect is the same.
Dump card state in both "Unexpected PKT busfree" paths.
In ahd_reset(), set the chip to SCSI mode before reading SXFRCTL1.
That register only exists in the SCSI mode. Also set the mode
explicitly to the SCSI mode after chip reset due to paranoia.
Re-arrange code so that SXFRCTL1 is restored as quickly after the
chip reset as possible.
S/G structurs must be 8byte aligned. Make this official by saying
so in our DMA tag.
Disable CIO bus stretch on MDFFSTAT if SHVALID is about to come
true. This can cause a CIO bus lockup if a PCI or PCI-X error
occurs while the stretch is occurring - the host cannot service
the PCI-X error since the CIO bus is locked out and SHVALID will
never resolve. The stretch was added in the Rev B to simplify the
wait for SHVALID to resolve, but the code to do this in the open
source sequencer is so simple it was never removed.
Consistently use MAX_OFFSET for the user max syncrate set from
non-volatile storage. This ensures that the offset does not
conflict with AH?_OFFSET_UNKNOWN.
Have ahd_pause_and_flushwork set the mode to ensure that it has
access to the registers it checks. Also modify the checking of
intstat so that the check against 0xFF can actually succeed if
the INT_PEND mask is something other than 0xFF. Although there
are no cardbus U320 controllers, this check may be needed to
recover from a hot-plug PCI removal that occurs without informing
the driver.
Fix a typo. sg_prefetch_cnt -> sg_prefetch_align. This fixes
an infinite loop at card initialization if the cacheline size is 0.
aic79xx.h:
Add AHD_EARLY_REQ_BUG bug flag.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
Change AH?_OFFSET_UNKNOWN to 0xFF. This is a value that the
curr->offset can never be, unlike '0' which we previously used.
This fixes code that only checks for a non-zero offset to
determine if a sync negotiation is required since it will fire
in the unknown case even if the goal is async.
aic79xx.reg:
Add comments for LQISTAT bits indicating their names in the 7902
data book. We use slightly different and more descriptive names
in the firmware.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
aic79xx.seq:
Update comments regarding rundown of the GSFIFO to reflect reality.
Fix spelling errors.
Since we use an 8byte address and 1 byte length, shorten the size
of a block move for the legacy DMA'ed CDB case from 11 to 9 bytes.
Remove code that, assuming the abort pending feature worked, would
set MK_MESSAGE in the SCB's control byte on completion to catch
invalid reselections. Since we don't see interrupts for completed
selections, this status update could occur prior to us noticing the
SELDO. The "select-out" queue logic will get confused by the
MK_MESSAGE bit being set as this is used to catch packatized
connections where we select-out with ATN. Since the abort pending
feature doesn't work on any released controllers yet, this code was
never executed.
Add support for the AHD_EARLY_REQ_BUG. Don't ignore persistent REQ
assertions just because they were asserted within the bus settle delay
window. This allows us to tolerate devices like the GEM318 that
violate the SCSI spec.
Remove unintentional settnig of SG_CACHE_AVAIL. Writing this bit
should have no effect, but who knows...
On the Rev A, we must wait for HDMAENACK before loading additional
segments to avoid clobbering the address of the first segment in
the S/G FIFO. This resolves data-corruption issues with certain
IBM (now Hitachi) and Fujitsu U320 drives.
Rearrange calc_residual to avoid an extra jmp instruction.
On RevA Silicon, if the target returns us to data-out after we
have already trained for data-out, it is possible for us to
transition the free running clock to data-valid before the required
100ns P1 setup time (8 P1 assertions in fast-160 mode). This will
only happen if this L-Q is a continuation of a data transfer for
which we have already prefetched data into our FIFO (LQ/Data
followed by LQ/Data for the same write transaction). This can
cause some target implementations to miss the first few data
transfers on the bus. We detect this situation by noticing that
this is the first data transfer after an LQ (LQIWORKONLQ true),
that the data transfer is a continuation of a transfer already
setup in our FIFO (SAVEPTRS interrupt), and that the transaction
is a write (DIRECTION set in DFCNTRL). The delay is performed by
disabling SCSIEN until we see the first REQ from the target.
Only compile in snapshot savepointers handler for RevA silicon
where it is enabled.
Handle the cfg4icmd packetized interrupt. We just need to load
the address and count, start the DMA, and CLRCHN once the transfer
is complete.
Fix an oversight in the overrun handler for packetized status
operations. We need to wait for either CTXTDONE or an overrun
when checking for an overrun. The previous code did not wait
and thus could decide that no overrun had occurred even though
an overrun will occur on the next data-valid req. Add some
comment to this section for clarity.
Use LAST_SEG_DONE instead of LASTSDONE for testing transfer
completion in the packetized status case. LASTSDONE may come up
more quickly since it only records completion on the SCSI side,
but since LAST_SEG_DONE is used everywhere else (and needs to be),
this is less confusing.
Add a missing invalidation of the longjmp address in the non-pack
handler. This code needs additional review.
aic79xx_inline.h:
Fix spelling error.
aic79xx_osm.c:
Set the cdb length for CDBs dma'ed from host memory.
Add a comment indicating that, should CAM start supporting cdbs
larger than 16bytes, the driver could store the CDB in the status
buffer.
aic79xx_pci.c:
Add a table entry for the 39320A.
Added a missing comma to an error string table.
Fix spelling errors.
2003-02-27 23:23:16 +00:00
|
|
|
alias SCB_HOST_CDB_PTR
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_RESIDUAL_SGPTR {
|
|
|
|
size 4
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_ADDR_MASK 0xf8 /* In the last byte */
|
2010-07-14 14:31:18 +00:00
|
|
|
field SG_ADDR_BIT 0x04
|
2002-08-31 06:49:11 +00:00
|
|
|
field SG_OVERRUN_RESID 0x02 /* In the first byte */
|
|
|
|
field SG_LIST_NULL 0x01 /* In the first byte */
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_SCSI_STATUS {
|
|
|
|
size 1
|
aic79xx.c:
Clear the LQICRC_NLQ status should it pop up after we have
already handled the SCSIPERR. During some streaming operations
this status can be delayed until the stream ends. Without this
change, the driver would complain about a "Missing case in
ahd_handle_scsiint".
In the LQOBUSFREE handler...
Don't return the LQOMGR back to the idle state until after
we have cleaned up ENSELO and any status related to this
selection. The last thing we need is the LQO manager starting
another select-out before we have updated the execution queue.
It is not clear whether the LQOMGR would, or would not
start a new selection early.
Make sure ENSELO is off prior to clearing SELDO by flushing
device writes.
Move assignment of the next target SCB pointer inside of
an if to make the code clearer. The effect is the same.
Dump card state in both "Unexpected PKT busfree" paths.
In ahd_reset(), set the chip to SCSI mode before reading SXFRCTL1.
That register only exists in the SCSI mode. Also set the mode
explicitly to the SCSI mode after chip reset due to paranoia.
Re-arrange code so that SXFRCTL1 is restored as quickly after the
chip reset as possible.
S/G structurs must be 8byte aligned. Make this official by saying
so in our DMA tag.
Disable CIO bus stretch on MDFFSTAT if SHVALID is about to come
true. This can cause a CIO bus lockup if a PCI or PCI-X error
occurs while the stretch is occurring - the host cannot service
the PCI-X error since the CIO bus is locked out and SHVALID will
never resolve. The stretch was added in the Rev B to simplify the
wait for SHVALID to resolve, but the code to do this in the open
source sequencer is so simple it was never removed.
Consistently use MAX_OFFSET for the user max syncrate set from
non-volatile storage. This ensures that the offset does not
conflict with AH?_OFFSET_UNKNOWN.
Have ahd_pause_and_flushwork set the mode to ensure that it has
access to the registers it checks. Also modify the checking of
intstat so that the check against 0xFF can actually succeed if
the INT_PEND mask is something other than 0xFF. Although there
are no cardbus U320 controllers, this check may be needed to
recover from a hot-plug PCI removal that occurs without informing
the driver.
Fix a typo. sg_prefetch_cnt -> sg_prefetch_align. This fixes
an infinite loop at card initialization if the cacheline size is 0.
aic79xx.h:
Add AHD_EARLY_REQ_BUG bug flag.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
Change AH?_OFFSET_UNKNOWN to 0xFF. This is a value that the
curr->offset can never be, unlike '0' which we previously used.
This fixes code that only checks for a non-zero offset to
determine if a sync negotiation is required since it will fire
in the unknown case even if the goal is async.
aic79xx.reg:
Add comments for LQISTAT bits indicating their names in the 7902
data book. We use slightly different and more descriptive names
in the firmware.
Fix spelling errors.
Include the CDB's length just after the CDB pointer in the DMA'ed
CDB case.
aic79xx.seq:
Update comments regarding rundown of the GSFIFO to reflect reality.
Fix spelling errors.
Since we use an 8byte address and 1 byte length, shorten the size
of a block move for the legacy DMA'ed CDB case from 11 to 9 bytes.
Remove code that, assuming the abort pending feature worked, would
set MK_MESSAGE in the SCB's control byte on completion to catch
invalid reselections. Since we don't see interrupts for completed
selections, this status update could occur prior to us noticing the
SELDO. The "select-out" queue logic will get confused by the
MK_MESSAGE bit being set as this is used to catch packatized
connections where we select-out with ATN. Since the abort pending
feature doesn't work on any released controllers yet, this code was
never executed.
Add support for the AHD_EARLY_REQ_BUG. Don't ignore persistent REQ
assertions just because they were asserted within the bus settle delay
window. This allows us to tolerate devices like the GEM318 that
violate the SCSI spec.
Remove unintentional settnig of SG_CACHE_AVAIL. Writing this bit
should have no effect, but who knows...
On the Rev A, we must wait for HDMAENACK before loading additional
segments to avoid clobbering the address of the first segment in
the S/G FIFO. This resolves data-corruption issues with certain
IBM (now Hitachi) and Fujitsu U320 drives.
Rearrange calc_residual to avoid an extra jmp instruction.
On RevA Silicon, if the target returns us to data-out after we
have already trained for data-out, it is possible for us to
transition the free running clock to data-valid before the required
100ns P1 setup time (8 P1 assertions in fast-160 mode). This will
only happen if this L-Q is a continuation of a data transfer for
which we have already prefetched data into our FIFO (LQ/Data
followed by LQ/Data for the same write transaction). This can
cause some target implementations to miss the first few data
transfers on the bus. We detect this situation by noticing that
this is the first data transfer after an LQ (LQIWORKONLQ true),
that the data transfer is a continuation of a transfer already
setup in our FIFO (SAVEPTRS interrupt), and that the transaction
is a write (DIRECTION set in DFCNTRL). The delay is performed by
disabling SCSIEN until we see the first REQ from the target.
Only compile in snapshot savepointers handler for RevA silicon
where it is enabled.
Handle the cfg4icmd packetized interrupt. We just need to load
the address and count, start the DMA, and CLRCHN once the transfer
is complete.
Fix an oversight in the overrun handler for packetized status
operations. We need to wait for either CTXTDONE or an overrun
when checking for an overrun. The previous code did not wait
and thus could decide that no overrun had occurred even though
an overrun will occur on the next data-valid req. Add some
comment to this section for clarity.
Use LAST_SEG_DONE instead of LASTSDONE for testing transfer
completion in the packetized status case. LASTSDONE may come up
more quickly since it only records completion on the SCSI side,
but since LAST_SEG_DONE is used everywhere else (and needs to be),
this is less confusing.
Add a missing invalidation of the longjmp address in the non-pack
handler. This code needs additional review.
aic79xx_inline.h:
Fix spelling error.
aic79xx_osm.c:
Set the cdb length for CDBs dma'ed from host memory.
Add a comment indicating that, should CAM start supporting cdbs
larger than 16bytes, the driver could store the CDB in the status
buffer.
aic79xx_pci.c:
Add a table entry for the 39320A.
Added a missing comma to an error string table.
Fix spelling errors.
2003-02-27 23:23:16 +00:00
|
|
|
alias SCB_HOST_CDB_LEN
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_TARGET_PHASES {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
SCB_TARGET_DATA_DIR {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
SCB_TARGET_ITAG {
|
|
|
|
size 1
|
|
|
|
}
|
|
|
|
SCB_SENSE_BUSADDR {
|
|
|
|
/*
|
|
|
|
* Only valid if CDB length is less than 13 bytes or
|
|
|
|
* we are using a CDB pointer. Otherwise contains
|
|
|
|
* the last 4 bytes of embedded cdb information.
|
|
|
|
*/
|
|
|
|
size 4
|
|
|
|
alias SCB_NEXT_COMPLETE
|
|
|
|
}
|
2003-05-30 02:14:22 +00:00
|
|
|
SCB_TAG {
|
|
|
|
alias SCB_FIFO_USE_COUNT
|
Correct spelling errors.
Switch to handling bad SCSI status as a sequencer interrupt
instead of having the kernel proccess these failures via
the completion queue. This is done because:
o The old scheme required us to pause the sequencer and clear
critical sections for each SCB. It seems that these pause
actions, if coincident with a sequencer FIFO interrupt, would
result in a FIFO interrupt getting lost or directing to the
wrong FIFO. This caused hangs when the driver was stressed
under high "queue full" loads.
o The completion code assumed that it was always called with
the sequencer running. This may not be the case in timeout
processing where completions occur manually via
ahd_pause_and_flushwork().
o With this scheme, the extra expense of clearing critical
sections is avoided since the sequencer will only self pause
once all pending selections have cleared and it is not in
a critical section.
aic79xx.c
Add code to handle the new BAD_SCB_STATUS sequencer
interrupt code. This just redirects the SCB through
the already existing ahd_complete_scb() code path.
Remove code in ahd_handle_scsi_status() that paused
the sequencer, made sure that no selections where
pending, and cleared critical sections. Bad
status SCBs are now only processed when all of these
conditions are true.
aic79xx.reg:
Add the BAD_SCB_STATUS sequencer interrupt code.
aic79xx.seq:
When completing an SCB upload to the host, if
we are doing this because the SCB contains non-zero
SCSI status, defer completing the SCB until there
are no pending selection events. When completing
these SCBs, use the new BAD_SCB_STATUS sequencer
interrupt. For all other uploaded SCBs (currently
only for underruns), the SCB is completed via the
normal done queue. Additionally, keep the SCB that
is currently being uploaded on the COMPLETE_DMA_SCB
list until the dma is completed, not just until the
DMA is started. This ensures that the DMA is restarted
properly should the host disable the DMA transfer for
some reason.
In our RevA workaround for Maxtor drives, guard against
the host pausing us while trying to pause I/O until the
first data-valid REQ by clearing the current snapshot
so that we can tell if the transfer has completed prior
to us noticing the REQINIT status.
In cfg4data_intr, shave off an instruction before getting
the data path running by adding an entrypoint to the
overrun handler to also increment the FIFO use count.
In the overrun handler, be sure to clear our LONGJMP
address in both exit paths.
Perform a few sequencer optimizations.
aic79xx.c:
Print the full path from the SCB when a packetized
status overrun occurs.
Remove references to LONGJMP_SCB which is being
removed from firmware usage.
Print the new SCB_FIFO_USE_COUNT field in the
per-SCB section of ahd_dump_card_state(). The
SCB_TAG field is now re-used by the sequencer,
so it no longer makes sense to reference this
field in the kernel driver.
aic79xx.h:
Re-arrange fields in the hardware SCB from largest
size type to smallest. This makes it easier to
move fields without changing field alignment.
The hardware scb tag field is now down near the
"spare" portion of the SCB to facilitate reuse
by the sequencer.
aic79xx.reg:
Remove LONGJMP_ADDR.
Rearrange SCB fields to match aic79xx.h.
Add SCB_FIFO_USE_COUNT as the first byte
of the SCB_TAG field.
aic79xx.seq:
Add a per-SCB "Fifos in use count" field and use
it to determine when it is safe (all data posted)
to deliver status back to the host. The old method
involved polling one or both FIFOs to verify that
the current task did not have pending data. This
makes running down the GSFIFO very cheap, so we
will empty the GSFIFO in one idle loop pass in
all cases.
Use this simplification of the completion process
to prune down the data FIFO teardown sequencer for
packetized transfers. Much more code is now shared
between the data residual and transfer complete cases.
Correct some issues in the packetized status handler.
It used to be possible to CLRCHN our FIFO before status
had fully transferred to the host. We also failed to
handle NONPACKREQ phases that could occur should a CRC
error occur during transmission of the status data packet.
Correct a few big endian issues:
aic79xx.c:
aic79xx_inline.h:
aic79xx_pci.c:
aic79xx_osm.c:
o Always get the SCB's tag via the SCB_GET_TAG acccessor
o Add missing use of byte swapping macros when touching
hscb fields.
o Don't double swap SEEPROM data when it is printed.
Correct a big-endian bug. We cannot assign a
o When assigning a 32bit LE variable to a 64bit LE
variable, we must be explict about how the words
of the 64bit LE variable are initialized. Cast to
(uint32_t*) to do this.
aic79xx.c:
In ahd_clear_critical_section(), hit CRLSCSIINT
after restoring the interrupt masks to avoid what
appears to be a glitch on SCSIINT. Any real SCSIINT
status will be persistent and will immidiately
reset SCSIINT. This clear should only get rid of
spurious SCSIINTs.
This glitch was the cause of the "Unexpected PKT busfree"
status that occurred under high queue full loads
Call ahd_fini_scbdata() after shutdown so that
any ahd_chip_init() routine that might access
SCB data will not access free'd memory.
Reset the bus on an IOERR since the chip doesn't
seem to reset to the new voltage level without
this.
Change offset calculation for scatter gather maps
so that the calculation is correct if an integral
multiple of sg lists does not fit in the allocation
size.
Adjust bus dma tag for data buffers based on 39BIT
addressing flag in our softc.
Use the QFREEZE count to simplify ahd_pause_and_flushworkd().
We can thus rely on the sequencer eventually clearing ENSELO.
In ahd_abort_scbs(), fix a bug that could potentially
corrupt sequencer state. The saved SCB was being
restored in the SCSI mode instead of the saved mode.
It turns out that the SCB did not need to be saved at all
as the scbptr is already restored by all subroutines
called during this function that modify that register.
aic79xx.c:
aic79xx.h:
aic79xx_pci.c:
Add support for parsing the seeprom vital product
data. The VPD data are currently unused.
aic79xx.h:
aic79xx.seq:
aic79xx_pci.c:
Add a firmware workaround to make the LED blink
brighter during packetized operations on the H2A.
aic79xx_inline.h:
The host does not use timer interrupts, so don't
gate our decision on whether or not to unpause
the sequencer on whether or not a timer interrupt
is pending.
2003-05-04 00:20:07 +00:00
|
|
|
size 2
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
SCB_CONTROL {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field TARGET_SCB 0x80
|
|
|
|
field DISCENB 0x40
|
|
|
|
field TAG_ENB 0x20
|
|
|
|
field MK_MESSAGE 0x10
|
|
|
|
field STATUS_RCVD 0x08
|
|
|
|
field DISCONNECTED 0x04
|
|
|
|
field SCB_TAG_TYPE 0x03
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_SCSIID {
|
|
|
|
size 1
|
2002-08-31 06:49:11 +00:00
|
|
|
field TID 0xF0
|
|
|
|
field OID 0x0F
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_LUN {
|
|
|
|
size 1
|
2003-05-26 21:26:52 +00:00
|
|
|
field LID 0xff
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
SCB_TASK_ATTRIBUTE {
|
|
|
|
size 1
|
2003-05-26 21:26:52 +00:00
|
|
|
/*
|
|
|
|
* Overloaded field for non-packetized
|
|
|
|
* ignore wide residue message handling.
|
|
|
|
*/
|
|
|
|
field SCB_XFERLEN_ODD 0x01
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
Correct spelling errors.
Switch to handling bad SCSI status as a sequencer interrupt
instead of having the kernel proccess these failures via
the completion queue. This is done because:
o The old scheme required us to pause the sequencer and clear
critical sections for each SCB. It seems that these pause
actions, if coincident with a sequencer FIFO interrupt, would
result in a FIFO interrupt getting lost or directing to the
wrong FIFO. This caused hangs when the driver was stressed
under high "queue full" loads.
o The completion code assumed that it was always called with
the sequencer running. This may not be the case in timeout
processing where completions occur manually via
ahd_pause_and_flushwork().
o With this scheme, the extra expense of clearing critical
sections is avoided since the sequencer will only self pause
once all pending selections have cleared and it is not in
a critical section.
aic79xx.c
Add code to handle the new BAD_SCB_STATUS sequencer
interrupt code. This just redirects the SCB through
the already existing ahd_complete_scb() code path.
Remove code in ahd_handle_scsi_status() that paused
the sequencer, made sure that no selections where
pending, and cleared critical sections. Bad
status SCBs are now only processed when all of these
conditions are true.
aic79xx.reg:
Add the BAD_SCB_STATUS sequencer interrupt code.
aic79xx.seq:
When completing an SCB upload to the host, if
we are doing this because the SCB contains non-zero
SCSI status, defer completing the SCB until there
are no pending selection events. When completing
these SCBs, use the new BAD_SCB_STATUS sequencer
interrupt. For all other uploaded SCBs (currently
only for underruns), the SCB is completed via the
normal done queue. Additionally, keep the SCB that
is currently being uploaded on the COMPLETE_DMA_SCB
list until the dma is completed, not just until the
DMA is started. This ensures that the DMA is restarted
properly should the host disable the DMA transfer for
some reason.
In our RevA workaround for Maxtor drives, guard against
the host pausing us while trying to pause I/O until the
first data-valid REQ by clearing the current snapshot
so that we can tell if the transfer has completed prior
to us noticing the REQINIT status.
In cfg4data_intr, shave off an instruction before getting
the data path running by adding an entrypoint to the
overrun handler to also increment the FIFO use count.
In the overrun handler, be sure to clear our LONGJMP
address in both exit paths.
Perform a few sequencer optimizations.
aic79xx.c:
Print the full path from the SCB when a packetized
status overrun occurs.
Remove references to LONGJMP_SCB which is being
removed from firmware usage.
Print the new SCB_FIFO_USE_COUNT field in the
per-SCB section of ahd_dump_card_state(). The
SCB_TAG field is now re-used by the sequencer,
so it no longer makes sense to reference this
field in the kernel driver.
aic79xx.h:
Re-arrange fields in the hardware SCB from largest
size type to smallest. This makes it easier to
move fields without changing field alignment.
The hardware scb tag field is now down near the
"spare" portion of the SCB to facilitate reuse
by the sequencer.
aic79xx.reg:
Remove LONGJMP_ADDR.
Rearrange SCB fields to match aic79xx.h.
Add SCB_FIFO_USE_COUNT as the first byte
of the SCB_TAG field.
aic79xx.seq:
Add a per-SCB "Fifos in use count" field and use
it to determine when it is safe (all data posted)
to deliver status back to the host. The old method
involved polling one or both FIFOs to verify that
the current task did not have pending data. This
makes running down the GSFIFO very cheap, so we
will empty the GSFIFO in one idle loop pass in
all cases.
Use this simplification of the completion process
to prune down the data FIFO teardown sequencer for
packetized transfers. Much more code is now shared
between the data residual and transfer complete cases.
Correct some issues in the packetized status handler.
It used to be possible to CLRCHN our FIFO before status
had fully transferred to the host. We also failed to
handle NONPACKREQ phases that could occur should a CRC
error occur during transmission of the status data packet.
Correct a few big endian issues:
aic79xx.c:
aic79xx_inline.h:
aic79xx_pci.c:
aic79xx_osm.c:
o Always get the SCB's tag via the SCB_GET_TAG acccessor
o Add missing use of byte swapping macros when touching
hscb fields.
o Don't double swap SEEPROM data when it is printed.
Correct a big-endian bug. We cannot assign a
o When assigning a 32bit LE variable to a 64bit LE
variable, we must be explict about how the words
of the 64bit LE variable are initialized. Cast to
(uint32_t*) to do this.
aic79xx.c:
In ahd_clear_critical_section(), hit CRLSCSIINT
after restoring the interrupt masks to avoid what
appears to be a glitch on SCSIINT. Any real SCSIINT
status will be persistent and will immidiately
reset SCSIINT. This clear should only get rid of
spurious SCSIINTs.
This glitch was the cause of the "Unexpected PKT busfree"
status that occurred under high queue full loads
Call ahd_fini_scbdata() after shutdown so that
any ahd_chip_init() routine that might access
SCB data will not access free'd memory.
Reset the bus on an IOERR since the chip doesn't
seem to reset to the new voltage level without
this.
Change offset calculation for scatter gather maps
so that the calculation is correct if an integral
multiple of sg lists does not fit in the allocation
size.
Adjust bus dma tag for data buffers based on 39BIT
addressing flag in our softc.
Use the QFREEZE count to simplify ahd_pause_and_flushworkd().
We can thus rely on the sequencer eventually clearing ENSELO.
In ahd_abort_scbs(), fix a bug that could potentially
corrupt sequencer state. The saved SCB was being
restored in the SCSI mode instead of the saved mode.
It turns out that the SCB did not need to be saved at all
as the scbptr is already restored by all subroutines
called during this function that modify that register.
aic79xx.c:
aic79xx.h:
aic79xx_pci.c:
Add support for parsing the seeprom vital product
data. The VPD data are currently unused.
aic79xx.h:
aic79xx.seq:
aic79xx_pci.c:
Add a firmware workaround to make the LED blink
brighter during packetized operations on the H2A.
aic79xx_inline.h:
The host does not use timer interrupts, so don't
gate our decision on whether or not to unpause
the sequencer on whether or not a timer interrupt
is pending.
2003-05-04 00:20:07 +00:00
|
|
|
SCB_CDB_LEN {
|
|
|
|
size 1
|
|
|
|
field SCB_CDB_LEN_PTR 0x80 /* CDB in host memory */
|
|
|
|
}
|
|
|
|
SCB_TASK_MANAGEMENT {
|
|
|
|
size 1
|
|
|
|
}
|
2003-05-30 02:14:22 +00:00
|
|
|
SCB_DATAPTR {
|
|
|
|
size 8
|
|
|
|
}
|
|
|
|
SCB_DATACNT {
|
|
|
|
/*
|
|
|
|
* The last byte is really the high address bits for
|
|
|
|
* the data address.
|
|
|
|
*/
|
|
|
|
size 4
|
|
|
|
field SG_LAST_SEG 0x80 /* In the fourth byte */
|
|
|
|
field SG_HIGH_ADDR_BITS 0x7F /* In the fourth byte */
|
|
|
|
}
|
|
|
|
SCB_SGPTR {
|
|
|
|
size 4
|
|
|
|
field SG_STATUS_VALID 0x04 /* In the first byte */
|
|
|
|
field SG_FULL_RESID 0x02 /* In the first byte */
|
|
|
|
field SG_LIST_NULL 0x01 /* In the first byte */
|
|
|
|
}
|
|
|
|
SCB_BUSADDR {
|
|
|
|
size 4
|
|
|
|
}
|
|
|
|
SCB_NEXT {
|
|
|
|
alias SCB_NEXT_SCB_BUSADDR
|
|
|
|
size 2
|
|
|
|
}
|
|
|
|
SCB_NEXT2 {
|
Correct spelling errors.
Switch to handling bad SCSI status as a sequencer interrupt
instead of having the kernel proccess these failures via
the completion queue. This is done because:
o The old scheme required us to pause the sequencer and clear
critical sections for each SCB. It seems that these pause
actions, if coincident with a sequencer FIFO interrupt, would
result in a FIFO interrupt getting lost or directing to the
wrong FIFO. This caused hangs when the driver was stressed
under high "queue full" loads.
o The completion code assumed that it was always called with
the sequencer running. This may not be the case in timeout
processing where completions occur manually via
ahd_pause_and_flushwork().
o With this scheme, the extra expense of clearing critical
sections is avoided since the sequencer will only self pause
once all pending selections have cleared and it is not in
a critical section.
aic79xx.c
Add code to handle the new BAD_SCB_STATUS sequencer
interrupt code. This just redirects the SCB through
the already existing ahd_complete_scb() code path.
Remove code in ahd_handle_scsi_status() that paused
the sequencer, made sure that no selections where
pending, and cleared critical sections. Bad
status SCBs are now only processed when all of these
conditions are true.
aic79xx.reg:
Add the BAD_SCB_STATUS sequencer interrupt code.
aic79xx.seq:
When completing an SCB upload to the host, if
we are doing this because the SCB contains non-zero
SCSI status, defer completing the SCB until there
are no pending selection events. When completing
these SCBs, use the new BAD_SCB_STATUS sequencer
interrupt. For all other uploaded SCBs (currently
only for underruns), the SCB is completed via the
normal done queue. Additionally, keep the SCB that
is currently being uploaded on the COMPLETE_DMA_SCB
list until the dma is completed, not just until the
DMA is started. This ensures that the DMA is restarted
properly should the host disable the DMA transfer for
some reason.
In our RevA workaround for Maxtor drives, guard against
the host pausing us while trying to pause I/O until the
first data-valid REQ by clearing the current snapshot
so that we can tell if the transfer has completed prior
to us noticing the REQINIT status.
In cfg4data_intr, shave off an instruction before getting
the data path running by adding an entrypoint to the
overrun handler to also increment the FIFO use count.
In the overrun handler, be sure to clear our LONGJMP
address in both exit paths.
Perform a few sequencer optimizations.
aic79xx.c:
Print the full path from the SCB when a packetized
status overrun occurs.
Remove references to LONGJMP_SCB which is being
removed from firmware usage.
Print the new SCB_FIFO_USE_COUNT field in the
per-SCB section of ahd_dump_card_state(). The
SCB_TAG field is now re-used by the sequencer,
so it no longer makes sense to reference this
field in the kernel driver.
aic79xx.h:
Re-arrange fields in the hardware SCB from largest
size type to smallest. This makes it easier to
move fields without changing field alignment.
The hardware scb tag field is now down near the
"spare" portion of the SCB to facilitate reuse
by the sequencer.
aic79xx.reg:
Remove LONGJMP_ADDR.
Rearrange SCB fields to match aic79xx.h.
Add SCB_FIFO_USE_COUNT as the first byte
of the SCB_TAG field.
aic79xx.seq:
Add a per-SCB "Fifos in use count" field and use
it to determine when it is safe (all data posted)
to deliver status back to the host. The old method
involved polling one or both FIFOs to verify that
the current task did not have pending data. This
makes running down the GSFIFO very cheap, so we
will empty the GSFIFO in one idle loop pass in
all cases.
Use this simplification of the completion process
to prune down the data FIFO teardown sequencer for
packetized transfers. Much more code is now shared
between the data residual and transfer complete cases.
Correct some issues in the packetized status handler.
It used to be possible to CLRCHN our FIFO before status
had fully transferred to the host. We also failed to
handle NONPACKREQ phases that could occur should a CRC
error occur during transmission of the status data packet.
Correct a few big endian issues:
aic79xx.c:
aic79xx_inline.h:
aic79xx_pci.c:
aic79xx_osm.c:
o Always get the SCB's tag via the SCB_GET_TAG acccessor
o Add missing use of byte swapping macros when touching
hscb fields.
o Don't double swap SEEPROM data when it is printed.
Correct a big-endian bug. We cannot assign a
o When assigning a 32bit LE variable to a 64bit LE
variable, we must be explict about how the words
of the 64bit LE variable are initialized. Cast to
(uint32_t*) to do this.
aic79xx.c:
In ahd_clear_critical_section(), hit CRLSCSIINT
after restoring the interrupt masks to avoid what
appears to be a glitch on SCSIINT. Any real SCSIINT
status will be persistent and will immidiately
reset SCSIINT. This clear should only get rid of
spurious SCSIINTs.
This glitch was the cause of the "Unexpected PKT busfree"
status that occurred under high queue full loads
Call ahd_fini_scbdata() after shutdown so that
any ahd_chip_init() routine that might access
SCB data will not access free'd memory.
Reset the bus on an IOERR since the chip doesn't
seem to reset to the new voltage level without
this.
Change offset calculation for scatter gather maps
so that the calculation is correct if an integral
multiple of sg lists does not fit in the allocation
size.
Adjust bus dma tag for data buffers based on 39BIT
addressing flag in our softc.
Use the QFREEZE count to simplify ahd_pause_and_flushworkd().
We can thus rely on the sequencer eventually clearing ENSELO.
In ahd_abort_scbs(), fix a bug that could potentially
corrupt sequencer state. The saved SCB was being
restored in the SCSI mode instead of the saved mode.
It turns out that the SCB did not need to be saved at all
as the scbptr is already restored by all subroutines
called during this function that modify that register.
aic79xx.c:
aic79xx.h:
aic79xx_pci.c:
Add support for parsing the seeprom vital product
data. The VPD data are currently unused.
aic79xx.h:
aic79xx.seq:
aic79xx_pci.c:
Add a firmware workaround to make the LED blink
brighter during packetized operations on the H2A.
aic79xx_inline.h:
The host does not use timer interrupts, so don't
gate our decision on whether or not to unpause
the sequencer on whether or not a timer interrupt
is pending.
2003-05-04 00:20:07 +00:00
|
|
|
size 2
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
2002-08-31 06:49:11 +00:00
|
|
|
SCB_SPARE {
|
|
|
|
size 8
|
|
|
|
alias SCB_PKT_LUN
|
|
|
|
}
|
2002-06-05 19:52:45 +00:00
|
|
|
SCB_DISCONNECTED_LISTS {
|
2002-08-31 06:49:11 +00:00
|
|
|
size 8
|
2002-06-05 19:52:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************** Constants ********************************/
|
|
|
|
const MK_MESSAGE_BIT_OFFSET 4
|
|
|
|
const TID_SHIFT 4
|
|
|
|
const TARGET_CMD_CMPLT 0xfe
|
|
|
|
const INVALID_ADDR 0x80
|
|
|
|
#define SCB_LIST_NULL 0xff
|
2002-08-31 06:49:11 +00:00
|
|
|
#define QOUTFIFO_ENTRY_VALID_TOGGLE 0x80
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
const CCSGADDR_MAX 0x80
|
|
|
|
const CCSCBADDR_MAX 0x80
|
|
|
|
const CCSGRAM_MAXSEGS 16
|
|
|
|
|
|
|
|
/* Selection Timeout Timer Constants */
|
|
|
|
const STIMESEL_SHIFT 3
|
|
|
|
const STIMESEL_MIN 0x18
|
|
|
|
const STIMESEL_BUG_ADJ 0x8
|
|
|
|
|
|
|
|
/* WDTR Message values */
|
|
|
|
const BUS_8_BIT 0x00
|
|
|
|
const BUS_16_BIT 0x01
|
|
|
|
const BUS_32_BIT 0x02
|
|
|
|
|
|
|
|
/* Offset maximums */
|
|
|
|
const MAX_OFFSET 0xfe
|
2002-12-01 08:13:37 +00:00
|
|
|
const MAX_OFFSET_PACED 0xfe
|
|
|
|
const MAX_OFFSET_PACED_BUG 0x7f
|
|
|
|
/*
|
|
|
|
* Some 160 devices incorrectly accept 0xfe as a
|
|
|
|
* sync offset, but will overrun this value. Limit
|
|
|
|
* to 0x7f for speed lower than U320 which will
|
|
|
|
* avoid the persistent sync offset overruns.
|
|
|
|
*/
|
|
|
|
const MAX_OFFSET_NON_PACED 0x7f
|
2002-06-05 19:52:45 +00:00
|
|
|
const HOST_MSG 0xff
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The size of our sense buffers.
|
|
|
|
* Sense buffer mapping can be handled in either of two ways.
|
|
|
|
* The first is to allocate a dmamap for each transaction.
|
|
|
|
* Depending on the architecture, dmamaps can be costly. The
|
|
|
|
* alternative is to statically map the buffers in much the same
|
|
|
|
* way we handle our scatter gather lists. The driver implements
|
|
|
|
* the later.
|
|
|
|
*/
|
|
|
|
const AHD_SENSE_BUFSIZE 256
|
|
|
|
|
|
|
|
/* Target mode command processing constants */
|
|
|
|
const CMD_GROUP_CODE_SHIFT 0x05
|
|
|
|
|
|
|
|
const STATUS_BUSY 0x08
|
|
|
|
const STATUS_QUEUE_FULL 0x28
|
|
|
|
const STATUS_PKT_SENSE 0xFF
|
|
|
|
const TARGET_DATA_IN 1
|
|
|
|
|
2002-08-31 06:49:11 +00:00
|
|
|
const SCB_TRANSFER_SIZE_FULL_LUN 56
|
|
|
|
const SCB_TRANSFER_SIZE_1BYTE_LUN 48
|
2002-06-05 19:52:45 +00:00
|
|
|
/* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */
|
|
|
|
const PKT_OVERRUN_BUFSIZE 512
|
|
|
|
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
/*
|
|
|
|
* Timer parameters.
|
|
|
|
*/
|
|
|
|
const AHD_TIMER_US_PER_TICK 25
|
|
|
|
const AHD_TIMER_MAX_TICKS 0xFFFF
|
2003-01-22 22:00:07 +00:00
|
|
|
const AHD_TIMER_MAX_US (AHD_TIMER_MAX_TICKS * AHD_TIMER_US_PER_TICK)
|
aic79xx.c:
Implement the SCB_SILENT flag. This is useful for
hushing up the driver during DV or other operations
that we expect to cause transmission errors. The
messages will still print if the SHOW_MASKED_ERRORS
debug option is enabled.
Save and restore the NEGOADDR address when setting
new transfer settings. The sequencer performs lookups
in the negotiation table too and it expects NEGOADDR
to remain consistent across pause/unpause sessions.
Consistently use "offset" instead of "period" to determine
if we are running sync or not.
Add a SHOW_MESSAGES diagnostic for when we assert ATN
during message processing.
Print out IU, QAS, and RTI features when showing transfer options.
Limit the syncrate after all option conformance
changes have taken place in ahd_devlimited_syncrate.
Changes in options may change the final syncrate we
accept.
Keep a copy of the hs_mailbox in our softc so that
we can perform read/modify/write operations on the
hs_mailbox without having to pause the sequencer to
read the last written value. Use the ENINT_COALESS
flag in the hs_mailbox to toggle interrupt coalessing.
Add entrypoints for enabling interrupt coalessing and
setting both a timeout (how long to wait for commands
to be coalessed) and a maximum commands to coaless value.
Add a statistics timer that decides when to enable or
disable interrupt coalessing based on load.
Add a routine, ahd_reset_cmds_pending() which is used
to update the CMDS_PENDING sequencer variable whenever
error recovery compeltes SCBs without notifying the
sequencer. Since ahd_reset_cmds_pending is called
during ahd_unpause() only if we've aborted SCBs, its
call to ahd_flush_qoutfifo should not cause recursion
through ahd_run_qoutfifo(). A panic has been added to
ensure that this recursion does not occur.
In ahd_search_qinfifo, update the CMDS_PENDING sequencer
variable directly. ahd_search_qinififo can be called
in situations where using ahd_reset_cmds_pending() might
cause recursion. Since we can safely determine the
exact number to reduce CMDS_PENDING by in this scenario
without running the qoutfifo, the manual update is sufficient.
Clean up diagnostics.
Add ahd_flush_qoutfifo() which will run the qoutfifo
as well as complete any commands sitting on the
sequencer's COMPLETE_SCB lists or the good status FIFO.
Use this routine in several places that did similar
things in an add-hoc, but incomplete, fashion. A call
to this routine was also added to ahd_abort_scbs() to
close a race.
In ahd_pause_and_flushwork() only return once selections
are safely disabled. Flush all completed commands via
ahd_flush_qoutfifo().
Remove "Now packetized" diagnostic now that this
information is incorperated into the actual negotiation
messages that are displayed.
When forcing renegotiation, don't clober the current
ppr_options. Much of the driver uses this information
to determine if we are currently packetized or not.
Remove some stray spaces at column 1 in ahd_set_tags.
When complaining about getting a host message loop
request with no pending messages, print out the
SCB_CONTROL register down on the card.
Modify the ahd_sent_msg() routine to handle a search
for an outgoing identify message. Use this to detect
a msg reject on an identify message which typically
indicates that the target thought we were packetized.
Force a renegotiation in this case.
In ahd_search_qinfifo(), wait more effectively for SCB
DMA activities to cease. We also disable SCB fetch
operations since we are about to change the qinfifo
and any fetch in progress will likely be invalidated.
In ahd_qinfifo_count(), fix the qinfifo empty case.
In ahd_dump_card_state(), print out CCSCBCTL in the
correct mode.
If we are a narrow controller, don't set the current
width to unknown when forcing a future negotiation.
This just confuses the code into attempting a wide
negotiation on a narrow bus.
Add support for task management function completions.
Modify ahd_handle_devreset so that it can handle
lun resets in addition to target resets. Use
ahd_handle_devreset for lun and target reset task
management functions.
Handle the abort task TMF race case better. We now
wait until any current selections are over and then
set the TMF back to zero. This should cause the sequencer
to ignore the abort TMF completion should it occur.
Correct a bug in the illegal phase handler that
caused us to drop down to narrow when handling the
unexpected command phase case after 3rd party
reset of a packetized device.
Indicate the features, bugs, and flags set in the softc
that are used to control firmware patch download when
booting verbose.
aic79xx.h:
Add coalessing and HS_MAILBOX fields.
Add per-softc variables for the stats "daemon".
Add a debug option for interrupt coalessing activities.
Add two new softc flags:
o AHD_UPDATE_PEND_CMDS
Run ahd_reset_cmds_pending() on the next unpause.
o AHD_RUNNING_QOUTFIFO
Used to catch recursion through ahd_run_qoutfifo().
aic79xx.reg:
Correct register addresses related to the software timer
and the DFDBCTL register.
Add constants paramaterizing the software timer.
Add scratch ram locations for storing interrupt coalessing
tunables.
Break INTMASK in SEQITNCTL out into INTMASK1 and INTMASK2.
In at least the REV A, these are writable bits. We make
use of that for a swtimer workaround in the sequencer.
Since HS_MAILBOX autoclears, provide a sequencer variable
to store its contents.
Add SEQINT codes for handling task management completions.
aic79xx.seq:
Correct ignore wide residue processing check for
a wide negotiation being in effect. We must be
in the SCSI register window in order to access the
negotiation table.
Use the software timer and a commands completed count to
implement interrupt coalessing. The command complete is
deferred until either the maximum command threshold or a
the expiration of a command deferral timer. If we have
more SCBs to complete to the host (sitting in COMPLETE_SCB
lists), always try to coaless them up to our coalessing limit.
If coalessing is enabled, but we have fewer commands oustanting
than the host's min coalessing limit, complete the command
immediately.
Add code to track the number of commands outstanding.
Commands are outstanding from the time they are placed
into the execution queue until the DMA to post completion
is setup.
Add a workaround for intvec_2 interrupts on the H2A4.
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. We use intvec_2 to
track interrupt coalessing timeouts.
Since we cannot disable the swtimer's countdown, simply
mask its interrupt once we no longer care about it firing.
In idle_loop_cchan, update LOCAL_HS_MAILBOX everytime
we are notified of an HS_MAILBOX update via the
HS_MAILBOX_ACT bit in QOFF_CTLSTA. We have to use a
local copy of persistant portions of the HS_MAILBOX as
the mailbox auto-clears on any read.
Move the test for the cfg4istat interrupt up an instruction
to hopefully close a race between the next outgoing selection
and our disabling of selections.
Add a missing ret to the last instruction in load_overrun_buf.
Add notifications to the host of task management
completions as well as the completions for commands
that completed successfully before their corresponding
TMF could be sent.
Hold a critical section during select-out processing
until we have a fully identified connection. This
removes a race condition with the legacy abort handler.
Correct a few spelling errors in some comments.
aic79xx_inline.h:
Call ahd_reset_cmds_pending() in ahd_unpause if required.
Update cmdcmplt interrupt statistics in our interrupt
handler.
Allow callers to ahd_send_scb() to set the task management
function.
aic79xx_pci.c:
Disable SERR and pause the controller prior to performing
our mmapped I/O test. The U320 controllers do not support
"auto-access-pause".
aic79xx_osm.c:
Set the task management function now that
ahd_send_scb() doesn't do it for us. We
also perform a lun reset in response to BDR
requests to packetized devices.
2003-01-20 20:17:35 +00:00
|
|
|
|
2002-06-05 19:52:45 +00:00
|
|
|
/*
|
|
|
|
* Downloaded (kernel inserted) constants
|
|
|
|
*/
|
|
|
|
const SG_PREFETCH_CNT download
|
|
|
|
const SG_PREFETCH_CNT_LIMIT download
|
|
|
|
const SG_PREFETCH_ALIGN_MASK download
|
|
|
|
const SG_PREFETCH_ADDR_MASK download
|
|
|
|
const SG_SIZEOF download
|
|
|
|
const PKT_OVERRUN_BUFOFFSET download
|
2002-08-31 06:49:11 +00:00
|
|
|
const SCB_TRANSFER_SIZE download
|
aic79xx.c:
Allow 500us between pauses in ahd_pause_and_flushwork().
The maximum we will wait is now 500ms.
In the same routine, remove any attempt to clear ENSELO.
Let the firmware do it once the current selection has
completed. This avoids some race conditions having to
do with non-packetized completions and the auto-clearing
of ENSELO on packetized completions.
Also avoid attempts to clear critical sections when
interrups are pending. We are going to loop again
anyway, so clearing critical sections is a waste of
time. It also may not be possible to clear a critical
section if the source of the interrupt was a SEQINT.
aic79xx_pci.c:
Use the Generic 9005 mask when looking for generic 7901B
parts. This allows the driver to attach to 7901B parts
on motherboards using a non-Adaptec subvendor ID.
aic79xx_inline.h:
Test for the SCBRAM_RD_BUG against the bugs
field, not the flags field in the softc.
aic79xx.c:
Cancel pending transactions on devices that
respond with a selection timeout. This decreases
the duration of timeout recovery when a device
disappears.
aic79xx.c:
Don't bother forcing renegotiation on a selection
timeout now that we use the device reset handler
to abort any pending commands on the target.
The device reset handler already takes us down
to async narrow and forces a renegotiation.
In the device reset handlers, only send a
BDR sent async event if the status is not
CAM_SEL_TIMEOUT. This avoids sending this
event in the selection timeout case
aic79xx.c:
Modify the Core timeout handler to verify that another
command has the potential to timeout before passing off
a command timeout as due to some other command. This
safety measure is added in response to a timeout recovery
failure on H2B where it appears that incoming reselection
status was lost during a drive pull test. In that case,
the recovery handler continued to wait for the command
that was active on the bus indefinetly. While the root
cause of the above issue is still being determined seems
a prudent safeguard.
aic79xx_pci.c:
Add a specific probe entry for the Dell OEM 39320(B).
aic79xx.c:
aic79xx.h:
aic79xx.reg:
aic79xx.seq:
Modify the aic79xx firmware to never cross a cacheline or
ADB boundary when DMA'ing completion entries to the host.
In PCI mode, at least in 32/33 configurations, the SCB
DMA engine may lose its place in the data-stream should
the target force a retry on something other than an
8byte aligned boundary. In PCI-X mode, we do this to
avoid split transactions since many chipsets seem to be
unable to format proper split completions to continue
the data transfer.
The above change allows us to drop our completion entries
from 8 bytes to 4. We were using 8 byte entries to ensure
that PCI retries could only occur on an 8byte aligned
boundary. Now that the sequencer guarantees this by splitting
up completions, we can safely drop the size to 4 bytes (2
byte tag, one byte SG_RESID, one byte pad).
Both the split-completion and PCI retry problems only show
up under high tag load when interrupt coalescing is being
especially effective. The switch from a 2byte completion
entry to an 8 byte entry to solve the PCI problem increased
the chance of incurring a split in PCI-X mode when multiple
transactions were completed at once. Dropping the completion
size to 4 bytes also means that we can complete more commands
in a single DMA (128byte FIFO -> 32 commands instead of 16).
aic79xx.c:
Modify the SCSIINT handler to defer clearing
sequencer critical sections to the individual
interrupt handlers. This allows us to
immediately disable any outgoing selections in
the case of an unexpected busfree so we don't
inadvertantly clear ENSELO *after* a new selection
has started. Doing so may cause the sequencer
to miss a successful selection.
In ahd_update_pending_scbs(), only clear ENSELO if
the bus is currently busy and a selection is not
already in progress or the sequencer has yet to
handle a pending selection. While we want to ensure
that the selection for the SCB at the head of the
selection queue is restarted so that any change in
negotiation request can take effect, we can't clobber
pending selection state without confusing the sequencer
into missing a selection.
2004-05-11 20:46:05 +00:00
|
|
|
const CACHELINE_MASK download
|
2002-06-05 19:52:45 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* BIOS SCB offsets
|
|
|
|
*/
|
|
|
|
const NVRAM_SCB_OFFSET 0x2C
|