/*
 * QLogic ISP2200 and ISP2300 Linux Driver Revision List File.
 *
 ********************************************************************
 *
 * Revision History
 *
 *  Rev  8.00.00b8	December 5, 2003	AV
 *	- Instruct mid-layer to perform initial scan.
 *
 *  Rev  8.00.00b7	December 5, 2003	AV
 *	- Resync with Linux Kernel 2.6.0-test11.
 *	- Add basic NVRAM parser (extras/qla_nvr).
 *
 *  Rev  8.00.00b7-pre11 December 3, 2003	AV
 *	- Sanitize the scsi_qla_host structure:
 *	  - Purge unused elements.
 *	  - Reorganize high-priority members (cache coherency).
 *	- Add support for NVRAM access via a sysfs binary attribute:
 *	  - Consolidate semaphore locking access.
 *	- Fix more PCI posting issues.
 *	- Add extras directory for dump/NVRAM tools.
 *	- Remove unused qla_vendor.c file.
 *
 *  Rev  8.00.00b7-pre11 November 26, 2003	DG/AV
 *	- Merge several patches from Christoph Hellwig [hch@lst.de]:
 *	  - in Linux 2.6 both pci and the scsi layer use the generic
 *	    dma direction bits, use them directly instead of the scsi
 *	    and pci variants and the (noop) conversion routines.
 *	- Fix _IOXX_BAD() usage for external IOCTL interface.
 *	- Use atomic construct for HA loop_state member.
 *	- Add generic model description text for HBA types.
 *
 *  Rev  8.00.00b7-pre5	November 17, 2003	AV
 *	- Merge several patches from Christoph Hellwig [hch@lst.de]:
 *	  - patch to split the driver into a common qla2xxx.ko and a
 *	    qla2?00.ko for each HBA type - the latter modules are
 *	    only very small wrappers, mostly for the firmware
 *	    images, all the meat is in the common qla2xxx.ko.
 *	  - make the failover code optional.
 *	  - kill useless lock_kernel in dpc thread startup.
 *	  - no need for modversions hacks in 2.6 (or 2.4).
 *	  - kill qla2x00_register_with_Linux.
 *	  - simplify EH code, cmd or it's hostdata can't be NULL, no
 *	    need to search whether the host it's ours, the midlayer
 *	    makes sure it won't call into a driver for some else
 *	    host.
 *	- Merge several patches from Jes Sorensen
 *	  [jes@wildopensource.com]:
 *	  - Call qla2x00_config_dma_addressing() before performing
 *	    any consistent allocations. This is required since the
 *	    dma mask settings will affect the memory
 *	    pci_alloc_consistent() will return.
 *	  - Call pci_set_consistent_dma_mask() to allow for 64 bit
 *	    consistent allocations, required on some platforms such
 *	    as the SN2.
 *	  - Wait 20 usecs (not sure how long is really necessary,
 *	    but this seems safe) after setting CSR_ISP_SOFT_RESET in
 *	    the ctrl_status register as the card doesn't respond to
 *	    PCI reads while in reset state. This causes a machine
 *	    check on some architectures.
 *	  - Flush PCI writes before calling udelay() to ensure the
 *	    write is not sitting idle in-flight for a while before
 *	    hitting the hardware.
 *	  - Include linux/vmalloc.h in qla_os.c since it uses
 *	    vmalloc().
 *	  - Use auto-negotiate link speed when using default
 *	    parameters rather than NVRAM settings. Disable NVRAM
 *	    reading on SN2 since it's not possible to execute the
 *	    HBA's BIOS on an SN2. I suggest doing something similar
 *	    for all architectures that do not provide x86 BIOS
 *	    emulation.
 *	- Clean-up slab-cache allocations:
 *	  - locking.
 *	  - mempool allocations in case of low-memory situations.
 *	- Fallback to GA_NXT scan if GID_PT call returns more than
 *	  MAX_FIBRE_DEVICES.
 *	- Preserve iterating port ID across GA_NXT calls in
 *	  qla2x00_find_all_fabric_devs().
 *	- Pre-calculate ASCII firmware dump length as to not incur the
 *	  cost-to-calculate at each invocation of a read().
 *
 *  Rev  8.00.00b6	November 4, 2003	AV
 *	- Add new 2300 TPX firmware (3.02.18).
 *
 *  Rev  8.00.00b6-pre25 October 20, 2003	RA/AV
 *	- Resync with Linux Kernel 2.6.0-test9.
 *	- Rework firmware dump process:
 *	  - Use binary attribute within sysfs tree.
 *	  - Add user-space tool (gdump.sh) to retrieve formatted
 *	    buffer.
 *	  - Add ISP2100 support.
 *	- Use a slab cache for SRB allocations to reduce memory
 *	  pressure.
 *	- Initial conversion of driver logging methods to a new
 *	  qla_printk() function which uses dev_printk (Daniel
 *	  Stekloff, IBM).
 *	- Further reduce stack usage in qla2x00_configure_local_loop()
 *	  and qla2x00_find_all_fabric_devs().
 *	- Separate port state used for routing of I/O's from port
 *	  mgmt-login retry etc.
 *
 *  Rev  8.00.00b6-pre19 October 13, 2003	AV
 *	- Resync with Linux Kernel 2.6.0-test7-bk5.
 *	- Add intelligent RSCN event handling:
 *	  - reduce scan time during 'port' RSCN events by only
 *	    querying specified port ids.
 *	  - Available on ISP23xx cards only.
 *	- Increase maximum number of recognizable targets from 256
 *	  to 512.
 *	  - Backend changes were previously added to support TPX
 *	    (2K logins) firmware.  Mid-layer can now scan for targets
 *	    (H, B, T, L) where 512 < T >= 0.
 *	- Remove IP support from driver.
 *	  - Switch firmware types from IP->TP for ISP22xx and
 *	    IPX->TPX for ISP23xx cards.
 *	  - Remove files qla_ip.[ch].
 *	- Remove type designations from firmware filenames.
 *
 *  Rev  8.00.00b6-pre11 September 15, 2003	DG/AV
 *	- Resync with 6.06.00.
 *	- Resync with Linux Kernel 2.6.0-test5-bk3.
 *	- Add new 2300 IPX firmware (3.02.15).
 *
 *  Rev  8.00.00b5	July 31, 2003		AV
 *	- Always create an fc_lun_t entry for lun 0 - as the mid-
 *	  layer requires access to this lun for discovery to occur.
 *	- General sanitizing:
 *	  - Add generic firmware option definitions.
 *	  - Generalize retrieval/update of firmware options.
 *	  - Fix compile errors which occur with extended debug.
 *	  - Handle failure cases for scsi_add_host() and
 *	    down_interruptible().
 *	- Host template updates:
 *	  - Use standard bios_param callback function.
 *	  - Disable clustering.
 *	  - Remove unchecked_is_dma entry.
 *
 *  Rev  8.00.00b5-pre5	July 29, 2003		DG/AV
 *	- Resync with 6.06.00b13.
 *	- Resync with Linux Kernel 2.6.0-test2.
 *	- Pass the complete loop_id, not the masked (0xff) value
 *	  while issuing mailbox commands (qla_mbx.c/qla_fo.c/
 *	  qla_iocb.c/qla_init.c).
 *	- Properly handle zero-length return status for an RLC CDB.
 *	- Create an fclun_t structure for 'disconnected' luns,
 *	  peripheral-qualifier of 001b.
 *	- Remove unused LIP-sequence register access during AE 8010.
 *	- Generalize qla2x00_mark_device_lost() to handle forced 
 *	  login request -- modify all direct/indirect invocations 
 *	  with proper flag.
 *	- Save RSCN notification (AE 8015h) data in a proper and 
 *	  consistent format (domain, area, al_pa).
 *	- General sanitizing:
 *	  - scsi_qla_host structure member reordering for cache-line
 *	    coherency.
 *	  - Remove unused SCSI opcodes, endian-swap definitions.
 *	  - Remove CMD_* pre-processor defines.
 *	  - Remove unused SCSIFCHOTSWAP/GAMAP/MULTIHOST codes.
 *	- Backout patch which added a per-scsi_qla_host scsi host
 *	  spinlock, since mid-layer already defines one.
 *	- Add new 2300 IPX firmware (3.02.15).
 *
 *  Rev  8.00.00b4	July 14, 2003		RA/DG/AV
 *	- Resync with 6.06.00b12.
 *	- Resync with Linux Kernel 2.6.0-test1.
 *	- Remove IOCB throttling code -- originally #if'd.
 *	- Remove apidev_*() routines since proc_mknod() has been
 *	  removed -- need alternate IOCTL interface.
 *	- Merge several performance/fix patches from Arjan van de
 *	  Ven:
 *	  - Undefined operation >> 32.
 *	  - No need to acquire mid-layer lock during command
 *	    callback. 
 *	  - Use a per-HBA mid-layer lock.
 *	  - Use a non-locked cycle for setting the count of the
 *	    newly allocated sp (qla2x00_get_new_sp()).
 *	  - Modify semantic behavior of qla2x00_queuecommand():
 *	    - Reduce cacheline bouncing by having I/Os submitted
 *	      by the IRQ handler.
 *	    - Remove extraneous calls to qla2x00_next() during I/O
 *	      queuing.
 *	  - Use list_splice_init() during qla2x00_done() handling
 *	    of commands to reduce list_lock contention.
 *	  - RIO mode support for ISP2200:
 *	    - Implementation differs slightly from original patch.
 *	  - Do not use bottom-half handler (tasklet/work queue)
 *	    for qla2x00_done() processing.
 *
 *  Rev  8.00.00b4-pre22 July 12, 2003		AV
 *	- Check for 'Process Response Queue' requests early during
 *	  the Host Status check.
 *	- General sanitizing:
 *	  - srb_t structure rewrite, removal of unused members.
 *	  - Remove unused fcdev array, fabricid, and PORT_*
 *	    definitions.
 *	  - Remove unused config_reg_t PCI definitions.
 *	- Add new 2200 IP firmware (2.02.06).
 *	- Add new 2300 IPX firmware (3.02.14).
 *
 *  Rev  8.00.00b4-pre19 June 30, 2003		AV
 *	- Resync with Linux Kernel 2.5.73-bk8.
 *	- Rework IOCB command queuing methods:
 *	  - Upper-layer driver *MUST* properly set the direction
 *	    bit of SCSI commands.
 *	  - Generalize 32bit/64bit queuing path functions.
 *	  - Remove costly page-boundary cross check when using
 *	    64bit address capable IOCBs.
 *
 *  Rev  8.00.00b4-pre15 June 19, 2003		AV
 *	- Resync with 6.06.00b11.
 *	- Continue fcport list consolidation work:
 *	  - Updated IOCTL implementations to use new fcports 
 *	    list.
 *	- Modified product ID check to not verify ISP chip
 *	  revision -- ISP2312 v3 (qla2x00_chip_diag()).
 *	- Add new 2300 IPX firmware (3.02.13):
 *
 *  Rev  8.00.00b4-pre13 June 19, 2003		AV
 *	- Fix build process for qla2100 driver -- no support
 *	  for IP.
 *	- SCSI host template modifications:
 *	  - Set sg_tablesize based on the derived DMA mask.
 *	  - Increase max_sectors since only limit within RISC
 *	    is transfer of (((2^32) - 1) >> 9) sectors.
 *
 *  Rev  8.00.00b4-pre12 June 18, 2003		RA, DG, RL, AV
 *	- Resync with 6.06.00b10.
 *	- Resync with Linux Kernel 2.5.72.
 *	- Initial fcport list consolidation work:
 *	  - fcports/fcinitiators/fcdev/fc_ip --> ha->fcports
 *	    list.
 *
 *  Rev  8.00.00b4-pre7	 June 05, 2003		AV
 *	- Properly release PCI resouces in init-failure case.
 *	- Reconcile disparite function return code definitions.
 *
 *  Rev  8.00.00b4-pre4	 June 03, 2003		AV
 *	- Resync with Linux Kernel 2.5.70-bk8:
 *	  - SHT proc_info() changes.
 *	- Restructure SNS Generic Services routines:
 *	  - Add qla_gs.c file to driver distribution.
 *	- Configure PCI latency timer for ISP23xx.
 *
 *  Rev  8.00.00b4-pre3	 June 02, 2003		RA, DG, RL, AV
 *	- Resync with 6.06.00b5.
 *	- Rework (again) PCI I/O space configuration
 *	  (Anton Blanchard):
 *	  - Use pci_set_mwi() routine;
 *	    - Remove uneeded qla2x00_set_cache_line() function.
 *	  - Remove extraneous modification of PCI_COMMAND word.
 *
 *  Rev  8.00.00b3 	 May 29, 2003		AV
 *	- Resync with Linux Kernel 2.5.70.
 *	- Move RISC paused check from ISR fast-path.
 *
 *  Rev  8.00.00b3-pre8 May 26, 2003		AV
 *	- Add new 2300 IPX firmware (3.02.12):
 *	- Rework PCI I/O space configuration.
 *
 *  Rev  8.00.00b3-pre6	May 22, 2003		RA, DG, RL, AV
 *	- Resync with 6.06.00b3.
 *
 *  Rev  8.00.00b3-pre4	May 21 2003		AV
 *	- Add new 2300 IPX firmware (3.02.11):
 *	  - Remove 2300 TPX firmware from distribution.
 *
 *  Rev  8.00.00b3-pre3	May 21 2003		AV
 *	- Properly setup PCI configuation space during
 *	  initialization:
 *	  - Properly configure Memory-Mapped I/O during early
 *	    configuration stage.
 *	- Rework IP functionality to support 2k logins.
 *	- Add new 2300 IPX firmware (3.02.11):
 *	  - Remove 2300 TPX firmware from distribution.
 *
 *  Rev  8.00.00b3-pre2	May ??, 2003		RA, DG, RL, AV
 *	- Resync with 6.06.00b1.
 *
 *  Rev  8.00.00b3-pre1	May ??, 2003		RA, DG, RL, AV
 *	- Resync with 6.05.00.
 *
 *  Rev  8.00.00b2	May 19, 2003		AV
 *	- Simplify dma_addr_t handling during command queuing given
 *	  new block-layer defined restrictions:
 *	  - Physical addresses not spanning 4GB boundaries.
 *	- Firmware versions: 2100 TP (1.19.24), 2200 IP (2.02.05),
 *	  2300 TPX (3.02.10).
 *
 *  Rev  8.00.00b2-pre1	May 13, 2003		AV
 *	- Add support for new 'Hotplug initialization' model. 
 *	- Simplify host template by removing unused callbacks.
 *	- Use scsicam facilities to determine geometry.
 *	- Fix compilation issues for non-ISP23xx builds:
 *	  - Correct register references in qla_dbg.c.
 *	  - Correct Makefile build process.
 *
 *  Rev  8.00.00b1	May 05, 2003		AV
 *	- Resync with Linux Kernel 2.5.69.
 *	- Firmware versions: 2100 TP (1.19.24), 2200 TP (2.02.05),
 *	  2300 TPX (3.02.10).
 *
 *  Rev  8.00.00b1-pre45 April ??, 2003		AV
 *	- Resync with Linux Kernel 2.5.68-bk11:
 *	- Fix improper return-code assignment during fabric
 *	  discovery.
 *	- Remove additional extraneous #defines from
 *	  qla_settings.h.
 *	  - USE_PORTNAME -- FO will always use portname.
 *	- Default queue depth size set to 64.
 *
 *  Rev  8.00.00b1-pre42 April ??, 2003		AV
 *	- Convert bottom-half tasklet to a work_queue.
 *	- Initial basic coding of dynamic queue depth handling
 *	  during QUEUE FULL statuses.
 *	- Fix mailbox interface problem with
 *	  qla2x00_get_retry_cnt().
 *
 *  Rev  8.00.00b1-pre41 April ??, 2003		AV
 *	- Convert build defines qla2[1|2|3]00 macros to
 *	  qla2[1|2|3]xx due to module name stringification clashes.
 *	- Add additional ISP2322 checks during board configuration.
 *
 *  Rev  8.00.00b1-pre40 April ??, 2003		AV
 *	- Resync with Linux Kernel 2.5.68-bk8:
 *	  - Updated IRQ handler interface.
 *	- Add ISP dump code (stub) in case of SYSTEM_ERROR on
 *	  ISP2100.
 *	- Add new 2200 IP firmware (2.02.05).
 *
 *  Rev  8.00.00b1-pre39 April ??, 2003		AV
 *	- Resync with Linux Kernel 2.5.68.
 *	- Add simple build.sh script to aid in external compilation.
 *	- Clean-break with Kernel 2.4 compatibility.
 *	  - Rework DPC routine -- completion routines for signaling.
 *	- Re-add HBAAPI character device node for IOCTL support.
 *	- Remove residual QLA2X_PERFORMANCE defines.
 *	- Allocate SP pool via __get_free_pages() rather than
 *	  individual kmalloc()'s.
 *	- Inform SCSI mid-layer of 16-byte CDB support
 *	  (host->max_cmd_len):
 *	  - Remove unecessary 'more_cdb' handling code from
 *	    qla_iocb.c and qla_xioct.c.
 *	- Reduce duplicate code in fabric scanning logic (MS IOCB
 *	  preparation).
 *	- Add ISP dump code in case of SYSTEM_ERROR.
 *	- Remove 2300 VIX firmware from distribution:
 *	  - Add initial code for IPX support.
 *	- Add new 2300 TPX firmware (3.02.10).
 *
 *  Rev  8.00.00b1-pre34 April ??, 2003		AV
 *	- Resync with Linux Kernel 2.5.67.
 *	- Use domain/area/al_pa fields when displaying PortID 
 *	  values -- addresses endianess issues.
 *	- Rework large case statement to check 'common' CDB commands
 *	  early in qla2x00_get_cmd_direction().
 *
 *  Rev  8.00.00b1-pre31 April ??, 2003		AV
 *	- Update makefile to support PPC64 build.
 *	- Retool NVRAM configuration routine and structures:
 *	  - Consoldate ISP21xx/ISP22xx/ISP23xx configuration
 *	    (struct nvram_t).
 *	  - Remove big/little endian support structures in favor of
 *	    simplified bit-operations within byte fields.
 *	- Fix long-standing 'static' buffer sharing problem in 
 *	  qla2x00_configure_fabric().
 *
 *  Rev  8.00.00b1-pre30 April ??, 2003		AV
 *	- Complete implementation of GID_PT scan.
 *	- Use consistent MS IOCB invocation method to query SNS:
 *	  - Add RNN_ID and RSNN_NN registrations in a fabric.
 *	- Remove unused Mailbox Command 6Eh (Send SNS) support
 *	  structures.
 *	- Use 64bit safe IOCBs while issuing INQUIRY and RLC during
 *	  topology scan.
 *	- Until reimplementation of fcdev_t/fcport list
 *	  consolidation, valid loop_id ranges are still limited from
 *	  0x00 through 0xFF -- enforce this within the code.
 *
 *  Rev  8.00.00b1-pre27 March ??, 2003		AV
 *	- Resync with 6.05.00b9.
 *	- Retool HBA PCI configuration -- qla2x00_pci_config().
 *	- Remove inconsistent use of delay routines (UDELAY/SYS*).
 *	- Continue to teardown/clean/add comments and debug
 *	  routines.
 *	- Properly swap bytes of the device's nodename in
 *	  qla2x00_configure_local_loop().
 *
 *  Rev  8.00.00b1-pre25 March ??, 2003		AV
 *	- Resync with 6.05.00b8.
 *
 *  Rev  8.00.00b1-pre23 March ??, 2003		AV
 *	- Remove (#define) IOCB usage throttling.
 *	- Abstract interrupt polling with qla2x00_poll().
 *	- Modify lun scanning logic:
 *	  - If the device does not support the SCSI Report Luns
 *	    command, the driver will now only scan from 0 to the
 *	    max#-luns as defined in the NVRAM (BIOS), rather than
 *	    blindly scanning from 0 to 255 -- which could result in
 *	    an increase in startup time when running against slow
 *	    (JBOD) devices.
 *	- Rework reset logic in qla2x00_reset_chip() (spec).
 *
 *  Rev  8.00.00b1-pre22 March ??, 2003		AV
 *	- Resync with 6.05.00b7.
 *	- Cleanup (rewrite) ISR handler.
 *	- Rename kmem_zalloc --> qla2x00_kmem_zalloc():
 *	  - This function will eventually be removed.
 *	- Add new 2300 VIX firmware (3.02.09):
 *	  - Support for Tape, Fabric, 2K logins, IP, and VI.
 *
 *  Rev  8.00.00b1-pre18 March ??, 2003		AV
 *	- Support 232x type ISPs.
 *	- Support single firmware for each ISP type:
 *	  - Restructure brd_info/fw_info methods.
 *	  - Streamline firmware load process.
 *	  - Properly query firmware for version information.
 *	- Remove extraneous scsi_qla_host members:
 *	  - device_id ==> pdev->device
 *	- Fix fc4 features (RFF_ID) registration.
 *	- Convert kmem_zalloc --> qla2x00_kmem_zalloc().
 *	- Remove unused/extraneous #defines (USE_PORTNAME).
 *
 *  Rev  8.00.00b1-pre14 March ??, 2003		AV
 *	- Resync with 6.05.00b6.
 *	- Initial source-code restructuring effort.
 *	  - Build procedure.
 *	  - Source file layout -- intuitive component layout.
 *	  - Remove unused #defines (*PERFORMANCE, WORD_FW_LOAD, etc).
 *	- Add support for 2K logins (TPX -- firmware).
 *	- Add module parameter ql2xsuspendcount.
 *	- Add new 2200 IP/TP firmware (2.02.04).
 *
 *  Rev  8.00.00b1-pre9	March ??, 2003	RL/DG/RA/AV
 *	- Use kernel struct list_head for fcport and fclun lists.
 *	- Remove extraneous (L|M)S_64BITS() and QL21_64*() defines.
 *
 *  Rev  8.00.00b1-pre8	February 28, 2003	RL/DG/RA/AV
 *	- Resync with 6.05.00b3.
 *
 *  Rev  8.00.00b1-pre7	February 23, 2003	RL/DG/RA/AV
 *	- Add alternate fabric scanning logic (GID_PT/GNN_ID/GPN_ID).
 *	- Remove use of deprecated function check_region().
 *	- Add new 2300 IP/TP firmware (3.02.08).
 *
 *  Rev  8.00.00b1-pre5	January 28, 2003	RL/DG/RA/AV
 *	- Resync with 6.05.00b3.
 *	- Consolidate device_reg structure definitions for ISP types.
 *	- Add support for new queue-depth selection.
 *	- Add new 2300 IP/TP firmware (3.02.07).
 *
 *  Rev  8.00.00b1-pre1	January 17, 2003	AV
 *	- Initial branch from 6.04.00b8 driver.
 *	- Remove VMWARE specific code.
 *	- Add support for pci_driver interface.
 *
 ********************************************************************/
