- Don't use SCMD_XFR command in message-in phase and status phase.
It causes unexpected hangs on heavy load. Instead transfer data
manually via TEMP register by SCMD_SET_ACK and SCMD_RST_ACK.
- Don't set SCMD_ICPT_XFR in spc_dataout_pio() and spc_msgout().
- Rewrite spc_datain_pio() to handle FIFO more properly.
- disable debug code by default
- use MI minphys()
- add proper delay in spc_find()
- initialize TMOD register in spc_reset()
- wrap a sanity check with #ifdef DIAGNOSTIC (sync with aic6360.c)
- no need to set LUN bits in SCSI command which should be done in mid-layer
- set proper resid even in error case
- fix/remove some bogus comments
This is a completely rewritten scsipi_xfer execution engine, and the
associated changes to HBA drivers. Overview of changes & features:
- All xfers are queued in the mid-layer, rather than doing so in an
ad-hoc fashion in individual adapter drivers.
- Adapter/channel resource management in the mid-layer, avoids even trying
to start running an xfer if the adapter/channel doesn't have the resources.
- Better communication between the mid-layer and the adapters.
- Asynchronous event notification mechanism from adapter to mid-layer and
peripherals.
- Better peripheral queue management: freeze/thaw, sorted requeueing during
recovery, etc.
- Clean separation of peripherals, adapters, and adapter channels (no more
scsipi_link).
- Kernel thread for each scsipi_channel makes error recovery much easier
(no more dealing with interrupt context when recovering from an error).
- Mid-layer support for tagged queueing: commands can have the tag type
set explicitly, tag IDs are allocated in the mid-layer (thus eliminating
the need to use buggy tag ID allocation schemes in many adapter drivers).
- support for QUEUE FULL and CHECK CONDITION status in mid-layer; the command
will be requeued, or a REQUEST SENSE will be sent as appropriate.
Just before the merge syssrc has been tagged with thorpej_scsipi_beforemerge
timeout()/untimeout() API:
- Clients supply callout handle storage, thus eliminating problems of
resource allocation.
- Insertion and removal of callouts is constant time, important as
this facility is used quite a lot in the kernel.
The old timeout()/untimeout() API has been removed from the kernel.