linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch 14/28] Sync up drivers/scsi/aic7xxx
@ 2004-09-28 13:06 Luben Tuikov
  0 siblings, 0 replies; only message in thread
From: Luben Tuikov @ 2004-09-28 13:06 UTC (permalink / raw)
  To: SCSI Mailing List

Sync up drivers/scsi/aic7xxx/. (2437-2541)

Signed-off-by: Luben Tuikov <luben_tuikov@adaptec.com>

==== //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#7 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/Kconfig.aic7xxx ====
--- /tmp/tmp.26656.0	2004-09-27 13:16:28.895541488 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/Kconfig.aic7xxx	2003-10-30 22:15:43.000000000 -0500
@@ -1,6 +1,6 @@
  #
  # AIC7XXX and AIC79XX 2.5.X Kernel configuration File.
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#7 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#8 $
  #
  config SCSI_AIC7XXX
  	tristate "Adaptec AIC7xxx Fast -> U160 support (New Driver)"
@@ -11,11 +11,6 @@
  	SCSI controllers (the 274x and 284x series).  For AAA and ARO based
  	configurations, only SCSI functionality is provided.

-	If you want to compile the driver as a module ( = code which can be
-	inserted in and removed from the running kernel whenever you want),
-	say M here and read <file:Documentation/modules.txt>.  The module
-	will be called aic7xxx.
-
  config AIC7XXX_CMDS_PER_DEVICE
  	int "Maximum number of TCQ commands per device"
  	depends on SCSI_AIC7XXX
==== //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#7 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/Makefile ====
--- /tmp/tmp.26656.1	2004-09-27 13:16:28.922537384 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/Makefile	2003-11-04 14:05:52.000000000 -0500
@@ -1,7 +1,7 @@
  #
  # Makefile for the Linux aic7xxx SCSI driver.
  #
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#7 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#8 $
  #

  # Let kbuild descend into aicasm when cleaning
@@ -58,6 +58,13 @@
  	-p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h

  ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
+# Create a dependency chain in generated files
+# to avoid concurrent invocations of the single
+# rule that builds them all.
+aic7xxx_seq.h: aic7xxx_reg.h
+ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
+aic7xxx_reg.h: aic7xxx_reg_print.c
+endif
  $(aic7xxx-gen-y): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm
  	$(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
  			      $(aicasm-7xxx-opts-y) -o $(obj)/aic7xxx_seq.h \
@@ -72,6 +79,13 @@
  	-p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h

  ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
+# Create a dependency chain in generated files
+# to avoid concurrent invocations of the single
+# rule that builds them all.
+aic79xx_seq.h: aic79xx_reg.h
+ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
+aic79xx_reg.h: aic79xx_reg_print.c
+endif
  $(aic79xx-gen-y): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm
  	$(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
  			      $(aicasm-79xx-opts-y) -o $(obj)/aic79xx_seq.h \
==== //depot/aic7xxx/aic7xxx/aic7770.c#32 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770.c ====
--- /tmp/tmp.26656.2	2004-09-27 13:16:28.998525832 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770.c	2003-10-30 22:17:01.000000000 -0500
@@ -37,7 +37,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#32 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#33 $
   *
   * $FreeBSD$
   */
@@ -175,7 +175,7 @@
  	case 15:
  		break;
  	default:
-		printf("aic7770_config: illegal irq setting %d\n", intdef);
+		printf("aic7770_config: invalid irq setting %d\n", intdef);
  		return (ENXIO);
  	}

==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#15 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770_osm.c ====
--- /tmp/tmp.26656.3	2004-09-27 13:16:29.062516104 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770_osm.c	2003-10-30 23:50:24.000000000 -0500
@@ -36,7 +36,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#15 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#16 $
   */

  #include "aic7xxx_osm.h"
@@ -190,6 +190,7 @@
  		free(name, M_DEVBUF);
  		return (ENOMEM);
  	}
+	ahc->dev_softc = dev;
  	error = aic7770_config(ahc, entry, eisaBase);
  	if (error != 0) {
  		ahc->bsh.ioport = 0;
==== //depot/aic7xxx/aic7xxx/aic79xx.seq#105 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx.seq ====
--- /tmp/tmp.26656.4	2004-09-27 13:16:29.587436304 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx.seq	2003-12-04 00:13:47.000000000 -0500
@@ -40,7 +40,7 @@
   * $FreeBSD$
   */

-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#105 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#106 $"
  PATCH_ARG_LIST = "struct ahd_softc *ahd"
  PREFIX = "ahd_"

@@ -108,9 +108,9 @@
  	call	idle_loop_cchan;
  	jmp	idle_loop;

-BEGIN_CRITICAL;
  idle_loop_gsfifo:
  	SET_MODE(M_SCSI, M_SCSI)
+BEGIN_CRITICAL;
  idle_loop_gsfifo_in_scsi_mode:
  	test	LQISTAT2, LQIGSAVAIL jz return;
  	/*
@@ -159,11 +159,15 @@

  idle_loop_service_fifos:
  	SET_MODE(M_DFF0, M_DFF0)
+BEGIN_CRITICAL;
  	test	LONGJMP_ADDR[1], INVALID_ADDR jnz idle_loop_next_fifo;
  	call	longjmp;
+END_CRITICAL;
  idle_loop_next_fifo:
  	SET_MODE(M_DFF1, M_DFF1)
+BEGIN_CRITICAL;
  	test	LONGJMP_ADDR[1], INVALID_ADDR jz longjmp;
+END_CRITICAL;
  return:
  	ret;

@@ -177,7 +181,6 @@
  	test	CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
  	test	CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
  	test	CCSCBCTL, CCSCBDONE jz return;
-END_CRITICAL;
  	/* FALLTHROUGH */
  scbdma_tohost_done:
  	test	CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone;
@@ -207,6 +210,7 @@
  	test	QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
  	bmov	QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
  	xor	QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret;
+END_CRITICAL;

  qoutfifo_updated:
  	/*
@@ -541,6 +545,7 @@
  SET_SRC_MODE	M_SCSI;
  SET_DST_MODE	M_SCSI;
  select_out:
+BEGIN_CRITICAL;
  	if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
  		/*
  		 * On Rev A. hardware, the busy LED is only
@@ -556,7 +561,6 @@
  		 */
  		or	SBLKCTL, DIAGLEDEN|DIAGLEDON;
  	}
-BEGIN_CRITICAL;
  	/* Clear out all SCBs that have been successfully sent. */
  	if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) {
  		/*
@@ -1868,7 +1872,6 @@
  	dec	SCB_FIFO_USE_COUNT;
  	test	SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
  	mvi	DFFSXFRCTL, CLRCHN ret;
-END_CRITICAL;

  /*
   * LAST_SEG_DONE status has been seen in the current FIFO.
@@ -1877,7 +1880,6 @@
   * Check for overrun and see if we can complete this command.
   */
  pkt_last_seg_done:
-BEGIN_CRITICAL;
  	/*
  	 * Mark transfer as completed.
  	 */
==== //depot/aic7xxx/aic7xxx/aic79xx.c#219 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_core.c ====
--- /tmp/tmp.26656.5	2004-09-27 13:16:31.763105552 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_core.c	2003-12-04 00:47:22.000000000 -0500
@@ -37,7 +37,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#219 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#220 $
   *
   * $FreeBSD$
   */
@@ -3190,11 +3190,13 @@
  		iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_PRECOMP_MASK;

  		if ((ahd->features & AHD_NEW_IOCELL_OPTS) != 0
-		 && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0) {
+		 && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0
+		 && (ppr_opts & MSG_EXT_PPR_IU_REQ) == 0) {
  			/*
  			 * Slow down our CRC interval to be
-			 * compatible with devices that can't
-			 * handle a CRC at full speed.
+			 * compatible with non-packetized
+			 * U160 devices that can't handle a
+			 * CRC at full speed.
  			 */
  			con_opts |= ENSLOWCRC;
  		}
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#188 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c ====
--- /tmp/tmp.26656.6	2004-09-27 13:16:32.967922392 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c	2003-11-06 17:10:19.000000000 -0500
@@ -1,7 +1,7 @@
  /*
   * Adaptec AIC79xx device driver for Linux.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#188 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#192 $
   *
   * --------------------------------------------------------------------------
   * Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -651,9 +651,9 @@
  		struct scatterlist *sg;

  		sg = (struct scatterlist *)cmd->request_buffer;
-		pci_unmap_sg(ahd->dev_softc, sg, cmd->use_sg, direction);
+		aic_unmap_sg(ahd, sg, cmd->use_sg, direction);
  	} else if (cmd->request_bufflen != 0) {
-		pci_unmap_single(ahd->dev_softc,
+		aic_unmap_single(ahd,
  				 scb->platform_data->buf_busaddr,
  				 cmd->request_bufflen, direction);
  	}
@@ -1215,8 +1215,7 @@
  	 && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
  		dev->flags |= AIC_DEV_UNCONFIGURED;
  		if (TAILQ_EMPTY(&dev->busyq)
-		 && dev->active == 0
-		 && (dev->flags & AIC_DEV_TIMER_ACTIVE) == 0)
+		 && dev->active == 0)
  			ahd_linux_free_device(ahd, dev);
  	}
  	ahd_midlayer_entrypoint_unlock(ahd, &flags);
@@ -1777,50 +1776,8 @@
  	return (SUCCESS);
  }

-Scsi_Host_Template aic79xx_driver_template = {
-	.module			= THIS_MODULE,
-	.name			= "aic79xx",
-	.proc_info		= ahd_linux_proc_info,
-	.info			= ahd_linux_info,
-	.queuecommand		= ahd_linux_queue,
-	.eh_abort_handler	= ahd_linux_abort,
-	.eh_device_reset_handler = ahd_linux_dev_reset,
-	.eh_bus_reset_handler	= ahd_linux_bus_reset,
-#if defined(__i386__)
-	.bios_param		= ahd_linux_biosparam,
-#endif
-	.can_queue		= AHD_MAX_QUEUE,
-	.this_id		= -1,
-	.cmd_per_lun		= 2,
-	.use_clustering		= ENABLE_CLUSTERING,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
-	/*
-	 * We can only map 16MB per-SG
-	 * so create a sector limit of
-	 * "16MB" in 2K sectors.
-	 */
-	.max_sectors		= 8192,
-#endif
-#if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
-/* Assume RedHat Distribution with its different HIGHIO conventions. */
-	.can_dma_32		= 1,
-	.single_sg_okay		= 1,
-#else
-	.highmem_io		= 1,
-#endif
-#endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-	.slave_alloc		= ahd_linux_slave_alloc,
-	.slave_configure	= ahd_linux_slave_configure,
-	.slave_destroy		= ahd_linux_slave_destroy,
-#else
-	.detect			= ahd_linux_detect,
-	.release		= ahd_linux_release,
-	.select_queue_depths	= ahd_linux_select_queue_depth,
-	.use_new_eh_code	= 1,
-#endif
-};
+Scsi_Host_Template aic79xx_driver_template =
+	AIC_TEMPLATE_INITIALIZER("aic79xx", /*max_sectors*/8192);

  /********************* Platform Dependent Functions ***************************/
  /*
@@ -2045,9 +2002,16 @@
  	char	*new_name;
  	u_long	s;
  	u_long	target;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	int	error;
+#endif

  	template->name = ahd->description;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	host = scsi_host_alloc(template, sizeof(struct ahd_softc *));
+#else
  	host = scsi_register(template, sizeof(struct ahd_softc *));
+#endif
  	if (host == NULL)
  		return (ENOMEM);

@@ -2133,7 +2097,10 @@
  	ahd_unlock(ahd, &s);

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-	scsi_add_host(host, &ahd->dev_softc->dev);
+	error = scsi_add_host(host, ahd->dev_softc);
+	if (error != 0)
+		return (-error);
+	scsi_scan_host(host);
  #endif
  	return (0);
  }
@@ -2265,8 +2232,10 @@
  		if (ahd->platform_data->host != NULL) {
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  			scsi_remove_host(ahd->platform_data->host);
-#endif
+			scsi_host_put(ahd->platform_data->host);
+#else
  			scsi_unregister(ahd->platform_data->host);
+#endif
  		}

  		/* destroy all of the device and target objects */
@@ -2280,6 +2249,7 @@
  					if (targ->devices[j] == NULL)
  						continue;
  					dev = targ->devices[j];
+					del_timer_sync(&dev->timer);
  					ahd_linux_free_device(ahd, dev);
  				}
  				/*
@@ -4122,8 +4092,7 @@

  			cur_seg = (struct scatterlist *)cmd->request_buffer;
  			dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-			nseg = pci_map_sg(ahd->dev_softc, cur_seg,
-					  cmd->use_sg, dir);
+			nseg = aic_map_sg(ahd, cur_seg, cmd->use_sg, dir);
  			scb->platform_data->xfer_len = 0;
  			for (sg = scb->sg_list; nseg > 0; nseg--, cur_seg++) {
  				bus_addr_t addr;
@@ -4142,7 +4111,7 @@

  			sg = scb->sg_list;
  			dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-			addr = pci_map_single(ahd->dev_softc,
+			addr = aic_map_single(ahd,
  					      cmd->request_buffer,
  					      cmd->request_bufflen, dir);
  			scb->platform_data->xfer_len = cmd->request_bufflen;
@@ -4532,8 +4501,7 @@

  	if (TAILQ_EMPTY(&dev->busyq)) {
  		if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-		 && dev->active == 0
-		 && (dev->flags & AIC_DEV_TIMER_ACTIVE) == 0)
+		 && dev->active == 0)
  			ahd_linux_free_device(ahd, dev);
  	} else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
  		TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq, dev, links);
@@ -5055,6 +5023,7 @@
  	 && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
  		ahd_linux_run_device_queue(ahd, dev);
  	if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
+	 && TAILQ_EMPTY(&dev->busyq)
  	 && dev->active == 0)
  		ahd_linux_free_device(ahd, dev);
  	ahd_unlock(ahd, &s);
@@ -5071,13 +5040,12 @@
  	int i;

  	host = ahd->platform_data->host;
-	printf("%s: Host Status: %s%s%s%s%s\n",
+	printf("%s: Host Status: Failed(%d) %s%s%s\n",
  	       ahd_name(ahd),
+	       host->host_failed,
  	       host->eh_active ? "eh_active " : "",
-	       host->in_recovery ? "in_recovery " : "",
  	       host->host_blocked ? "host_blocked " : "",
-	       host->host_self_blocked ? "host_self_blocked " : "",
-	       host->some_device_starved ? "some_device_starved" : "");
+	       host->host_self_blocked ? "host_self_blocked " : "");
  	
  	maxtarget = (ahd->features & AHD_WIDE) ? 15 : 7;
  	for (target = 0; target <=maxtarget; target++) {
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#149 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h ====
--- /tmp/tmp.26656.7	2004-09-27 13:16:33.711809304 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h	2003-11-04 14:17:43.000000000 -0500
@@ -36,23 +36,13 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#149 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#152 $
   *
   */
  #ifndef _AIC79XX_LINUX_H_
  #define _AIC79XX_LINUX_H_

-#include <linux/types.h>
-#include <linux/blk.h>
-#include <linux/blkdev.h>
-#include <linux/delay.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/smp_lock.h>
  #include <linux/version.h>
-#include <linux/module.h>
-#include <asm/byteorder.h>
-#include <asm/io.h>

  #ifndef KERNEL_VERSION
  #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
@@ -60,27 +50,8 @@

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  #include <linux/config.h>
-#include <linux/slab.h>
-#else
-#include <linux/malloc.h>
-#endif
-
-/* Core SCSI definitions */
-#define AIC_LIB_PREFIX ahd
-#define AIC_CONST_PREFIX AHD
-#include "scsi.h"
-#include "hosts.h"
-
-/* Name space conflict with BSD queue macros */
-#ifdef LIST_HEAD
-#undef LIST_HEAD
  #endif

-#include "cam.h"
-#include "queue.h"
-#include "scsi_message.h"
-#include "scsi_iu.h"
-
  /*********************************** Debugging ********************************/
  #ifdef CONFIG_AIC79XX_DEBUG_ENABLE
  #ifdef CONFIG_AIC79XX_DEBUG_MASK
@@ -96,16 +67,11 @@
  /* No debugging code. */
  #endif

-/************************* Configuration Data *********************************/
-extern uint32_t aic79xx_allow_memio;
-extern int aic79xx_detect_complete;
-extern Scsi_Host_Template aic79xx_driver_template;
-
-/***************************** Domain Validation ******************************/
-void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
-void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
-
  /********************************** Includes **********************************/
+/* Core SCSI definitions */
+#define AIC_LIB_PREFIX ahd
+#define AIC_CONST_PREFIX AHD
+
  #ifdef CONFIG_AIC79XX_REG_PRETTY_PRINT
  #define AIC_DEBUG_REGISTERS 1
  #else
@@ -114,6 +80,15 @@
  #define AIC_CORE_INCLUDE "aic79xx.h"
  #include "aiclib.h"

+/************************* Configuration Data *********************************/
+extern uint32_t aic79xx_allow_memio;
+extern int aic79xx_detect_complete;
+extern Scsi_Host_Template aic79xx_driver_template;
+
+/***************************** Domain Validation ******************************/
+void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
+void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
+
  /***************************** SMP support ************************************/
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
  #include <linux/spinlock.h>
@@ -127,7 +102,7 @@
  #define AHD_SCSI_HAS_HOST_LOCK 0
  #endif

-#define AIC79XX_DRIVER_VERSION "2.0.3"
+#define AIC79XX_DRIVER_VERSION "2.0.4"

  /********************* Definitions Required by the Core ***********************/
  /*
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#28 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c ====
--- /tmp/tmp.26656.8	2004-09-27 13:16:34.612672352 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c	2003-10-31 18:32:28.000000000 -0500
@@ -36,7 +36,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#28 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#29 $
   */

  #include "aic79xx_osm.h"
@@ -76,10 +76,10 @@
  MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table);

  struct pci_driver aic79xx_pci_driver = {
-	name:		"aic79xx",
-	probe:		ahd_linux_pci_dev_probe,
-	remove:		ahd_linux_pci_dev_remove,
-	id_table:	ahd_linux_pci_id_table
+	.name		= "aic79xx",
+	.probe		= ahd_linux_pci_dev_probe,
+	.remove		= ahd_linux_pci_dev_remove,
+	.id_table	= ahd_linux_pci_id_table
  };

  static void
@@ -114,7 +114,7 @@
  {
  	char		 buf[80];
  	struct		 ahd_softc *ahd;
-	aic_dev_softc_t	 pci;
+	aic_dev_softc_t	 dev;
  	struct		 ahd_pci_identity *entry;
  	char		*name;
  	int		 error;
@@ -125,7 +125,7 @@
  	TAILQ_FOREACH(ahd, &ahd_tailq, links) {
  		struct pci_dev *probed_pdev;

-		probed_pdev = ahd->dev_softc;
+		probed_pdev = aic_pci_dev(ahd);
  		if (probed_pdev->bus->number == pdev->bus->number
  		 && probed_pdev->devfn == pdev->devfn)
  			break;
@@ -135,8 +135,8 @@
  		return (-ENODEV);
  	}

-	pci = pdev;
-	entry = ahd_find_pci_device(pci);
+	dev = aic_pci_dev_to_dev(pdev);
+	entry = ahd_find_pci_device(dev);
  	if (entry == NULL)
  		return (-ENODEV);

@@ -146,9 +146,9 @@
  	 * common detect routine.
  	 */
  	sprintf(buf, "ahd_pci:%d:%d:%d",
-		aic_get_pci_bus(pci),
-		aic_get_pci_slot(pci),
-		aic_get_pci_function(pci));
+		aic_get_pci_bus(dev),
+		aic_get_pci_slot(dev),
+		aic_get_pci_function(dev));
  	name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
  	if (name == NULL)
  		return (-ENOMEM);
@@ -156,6 +156,7 @@
  	ahd = ahd_alloc(NULL, name);
  	if (ahd == NULL)
  		return (-ENOMEM);
+	ahd->dev_softc = dev;
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  	if (pci_enable_device(pdev)) {
  		ahd_free(ahd);
@@ -172,20 +173,19 @@
  		mask_64bit = (bus_addr_t)0xFFFFFFFFFFFFFFFFULL;
  		mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
  		if (memsize >= 0x8000000000ULL
-	 	 && aic_pci_set_dma_mask(pdev, mask_64bit) == 0) {
+	 	 && aic_set_dma_mask(ahd, mask_64bit) == 0) {
  			ahd->flags |= AHD_64BIT_ADDRESSING;
  			ahd->platform_data->hw_dma_mask = mask_64bit;
  		} else if (memsize > 0x80000000
-			&& aic_pci_set_dma_mask(pdev, mask_39bit) == 0) {
+			&& aic_set_dma_mask(ahd, mask_39bit) == 0) {
  			ahd->flags |= AHD_39BIT_ADDRESSING;
  			ahd->platform_data->hw_dma_mask = mask_39bit;
  		}
  	} else {
-		aic_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+		aic_set_dma_mask(ahd, 0xFFFFFFFF);
  		ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
  	}
  #endif
-	ahd->dev_softc = pci;
  	error = ahd_pci_config(ahd, entry);
  	if (error != 0) {
  		ahd_free(ahd);
@@ -224,10 +224,8 @@
  	pdev = NULL;
  	class = PCI_CLASS_STORAGE_SCSI << 8;
  	while ((pdev = pci_find_class(class, pdev)) != NULL) {
-		aic_dev_softc_t pci;
  		int error;

-		pci = pdev;
  		error = ahd_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
  		if (error == 0)
  			found++;
@@ -246,14 +244,15 @@
  ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd, u_long *base,
  				 u_long *base2)
  {
+
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-	*base = pci_resource_start(ahd->dev_softc, 0);
+	*base = pci_resource_start(aic_pci_dev(ahd), 0);
  	/*
  	 * This is really the 3rd bar and should be at index 2,
  	 * but the Linux PCI code doesn't know how to "count" 64bit
  	 * bars.
  	 */
-	*base2 = pci_resource_start(ahd->dev_softc, 3);
+	*base2 = pci_resource_start(aic_pci_dev(ahd), 3);
  #else
  	*base = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
  	*base2 = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
@@ -297,7 +296,7 @@

  	error = 0;
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-	start = pci_resource_start(ahd->dev_softc, 1);
+	start = pci_resource_start(aic_pci_dev(ahd), 1);
  	base_page = start & PAGE_MASK;
  	base_offset = start - base_page;
  #else
@@ -405,10 +404,10 @@
  {
  	int error;

-	error = request_irq(ahd->dev_softc->irq, ahd_linux_isr,
+	error = request_irq(aic_pci_dev(ahd)->irq, ahd_linux_isr,
  			    SA_SHIRQ, "aic79xx", ahd);
  	if (error == 0)
-		ahd->platform_data->irq = ahd->dev_softc->irq;
+		ahd->platform_data->irq = aic_pci_dev(ahd)->irq;
  	
  	return (-error);
  }
==== //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx.reg ====
--- /tmp/tmp.26656.9	2004-09-27 13:16:35.165588296 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx.reg	2003-11-03 14:00:18.000000000 -0500
@@ -39,7 +39,7 @@
   *
   * $FreeBSD$
   */
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $"

  /*
   * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -1306,7 +1306,6 @@
  	 */
  	MWI_RESIDUAL {
  		size		1
-		alias	TARG_IMMEDIATE_SCB
  	}
  	/*
  	 * SCBID of the next SCB to be started by the controller.
@@ -1461,6 +1460,7 @@
  	 */
  	LAST_MSG {
  		size		1
+		alias	TARG_IMMEDIATE_SCB
  	}

  	/*
==== //depot/aic7xxx/aic7xxx/aic7xxx.c#144 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_core.c ====
--- /tmp/tmp.26656.10	2004-09-27 13:16:36.640364096 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_core.c	2003-11-07 14:07:15.000000000 -0500
@@ -37,7 +37,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#144 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#145 $
   *
   * $FreeBSD$
   */
@@ -5115,8 +5115,14 @@
  	ahc->flags |= AHC_ALL_INTERRUPTS;
  	paused = FALSE;
  	do {
-		if (paused)
+		if (paused) {
  			ahc_unpause(ahc);
+			/*
+			 * Give the sequencer some time to service
+			 * any active selections.
+			 */
+			aic_delay(200);
+		}
  		ahc_intr(ahc);
  		ahc_pause(ahc);
  		paused = TRUE;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#251 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c ====
--- /tmp/tmp.26656.11	2004-09-27 13:16:37.476237024 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c	2003-11-06 17:11:24.000000000 -0500
@@ -1,7 +1,7 @@
  /*
   * Adaptec AIC7xxx device driver for Linux.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#251 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#255 $
   *
   * Copyright (c) 1994 John Aycock
   *   The University of Calgary Department of Computer Science.
@@ -139,7 +139,6 @@
  #endif

  #include <linux/mm.h>		/* For fetching system memory size */
-#include <linux/blk.h>		/* For block_size() */

  /************************* Magic SysReq Support *******************************/
  static struct aic_sysrq_key_op ahc_sysrq_op =
@@ -658,10 +657,10 @@
  		struct scatterlist *sg;

  		sg = (struct scatterlist *)cmd->request_buffer;
-		pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg,
+		aic_unmap_sg(ahc, sg, cmd->use_sg,
  			     scsi_to_pci_dma_dir(cmd->sc_data_direction));
  	} else if (cmd->request_bufflen != 0) {
-		pci_unmap_single(ahc->dev_softc,
+		aic_unmap_single(ahc,
  				 scb->platform_data->buf_busaddr,
  				 cmd->request_bufflen,
  				 scsi_to_pci_dma_dir(cmd->sc_data_direction));
@@ -1218,8 +1217,7 @@
  	 && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
  		dev->flags |= AIC_DEV_UNCONFIGURED;
  		if (TAILQ_EMPTY(&dev->busyq)
-		 && dev->active == 0
-	 	 && (dev->flags & AIC_DEV_TIMER_ACTIVE) == 0)
+		 && dev->active == 0)
  			ahc_linux_free_device(ahc, dev);
  	}
  	ahc_midlayer_entrypoint_unlock(ahc, &flags);
@@ -1413,50 +1411,8 @@
  	return SUCCESS;
  }

-Scsi_Host_Template aic7xxx_driver_template = {
-	.module			= THIS_MODULE,
-	.name			= "aic7xxx",
-	.proc_info		= ahc_linux_proc_info,
-	.info			= ahc_linux_info,
-	.queuecommand		= ahc_linux_queue,
-	.eh_abort_handler	= ahc_linux_abort,
-	.eh_device_reset_handler = ahc_linux_dev_reset,
-	.eh_bus_reset_handler	= ahc_linux_bus_reset,
-#if defined(__i386__)
-	.bios_param		= ahc_linux_biosparam,
-#endif
-	.can_queue		= AHC_MAX_QUEUE,
-	.this_id		= -1,
-	.cmd_per_lun		= 2,
-	.use_clustering		= ENABLE_CLUSTERING,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
-	/*
-	 * We can only map 16MB per-SG
-	 * so create a sector limit of
-	 * "16MB" in 2K sectors.
-	 */
-	.max_sectors		= 8192,
-#endif
-#if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
-/* Assume RedHat Distribution with its different HIGHIO conventions. */
-	.can_dma_32		= 1,
-	.single_sg_okay		= 1,
-#else
-	.highmem_io		= 1,
-#endif
-#endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-	.slave_alloc		= ahc_linux_slave_alloc,
-	.slave_configure	= ahc_linux_slave_configure,
-	.slave_destroy		= ahc_linux_slave_destroy,
-#else
-	.detect			= ahc_linux_detect,
-	.release		= ahc_linux_release,
-	.select_queue_depths	= ahc_linux_select_queue_depth,
-	.use_new_eh_code	= 1,
-#endif
-};
+Scsi_Host_Template aic7xxx_driver_template =
+	AIC_TEMPLATE_INITIALIZER("aic7xxx", /* max_sectors*/8192);

  /******************************** Macros **************************************/
  #define BUILD_SCSIID(ahc, cmd)						    \
@@ -1686,9 +1642,16 @@
  	char	*new_name;
  	u_long	 s;
  	u_int	 targ_offset;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	int	 error;
+#endif

  	template->name = ahc->description;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+	host = scsi_host_alloc(template, sizeof(struct ahc_softc *));
+#else
  	host = scsi_register(template, sizeof(struct ahc_softc *));
+#endif
  	if (host == NULL)
  		return (ENOMEM);

@@ -1785,7 +1748,10 @@
  	ahc_unlock(ahc, &s);

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-	scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
+	error = scsi_add_host(host, ahc->dev_softc);
+	if (error != 0)
+		return (-error);
+	scsi_scan_host(host);
  #endif
  	return (0);
  }
@@ -1944,8 +1910,10 @@
  		if (ahc->platform_data->host != NULL) {
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
  			scsi_remove_host(ahc->platform_data->host);
-#endif
+			scsi_host_put(ahc->platform_data->host);
+#else
  			scsi_unregister(ahc->platform_data->host);
+#endif
  		}

  		/* destroy all of the device and target objects */
@@ -1959,6 +1927,7 @@
  					if (targ->devices[j] == NULL)
  						continue;
  					dev = targ->devices[j];
+					del_timer_sync(&dev->timer);
  					ahc_linux_free_device(ahc, dev);
  				}
  				/*
@@ -3748,7 +3717,7 @@
  			int	nseg;

  			cur_seg = (struct scatterlist *)cmd->request_buffer;
-			nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
+			nseg = aic_map_sg(ahc, cur_seg, cmd->use_sg,
  			    scsi_to_pci_dma_dir(cmd->sc_data_direction));
  			end_seg = cur_seg + nseg;
  			/* Copy the segments into the SG list. */
@@ -3790,7 +3759,7 @@
  			bus_addr_t addr;

  			sg = scb->sg_list;
-			addr = pci_map_single(ahc->dev_softc,
+			addr = aic_map_single(ahc,
  			       cmd->request_buffer,
  			       cmd->request_bufflen,
  			       scsi_to_pci_dma_dir(cmd->sc_data_direction));
@@ -3981,7 +3950,7 @@
  {
  	struct aic_linux_target *targ;

-	del_timer_sync(&dev->timer);
+	del_timer(&dev->timer);
  	targ = dev->target;
  	targ->devices[dev->lun] = NULL;
  	free(dev, M_DEVBUF);
@@ -4234,8 +4203,7 @@

  	if (TAILQ_EMPTY(&dev->busyq)) {
  		if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-		 && dev->active == 0
-	 	 && (dev->flags & AIC_DEV_TIMER_ACTIVE) == 0)
+		 && dev->active == 0)
  			ahc_linux_free_device(ahc, dev);
  	} else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
  		TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
@@ -4710,7 +4678,8 @@
  	if (dev->qfrozen == 0
  	 && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
  		ahc_linux_run_device_queue(ahc, dev);
-	if (TAILQ_EMPTY(&dev->busyq)
+	if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
+	 && TAILQ_EMPTY(&dev->busyq)
  	 && dev->active == 0)
  		ahc_linux_free_device(ahc, dev);
  	ahc_unlock(ahc, &s);
@@ -5071,13 +5040,12 @@
  	int i;

  	host = ahc->platform_data->host;
-	printf("%s: Host Status: %s%s%s%s%s\n",
+	printf("%s: Host Status: Failed(%d) %s%s%s\n",
  	       ahc_name(ahc),
+	       host->host_failed,
  	       host->eh_active ? "eh_active " : "",
-	       host->in_recovery ? "in_recovery " : "",
  	       host->host_blocked ? "host_blocked " : "",
-	       host->host_self_blocked ? "host_self_blocked " : "",
-	       host->some_device_starved ? "some_device_starved" : "");
+	       host->host_self_blocked ? "host_self_blocked " : "");
  	
  	maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
  	maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#162 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h ====
--- /tmp/tmp.26656.12	2004-09-27 13:16:37.561224104 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h	2003-11-04 14:17:11.000000000 -0500
@@ -53,23 +53,13 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#162 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#165 $
   *
   */
  #ifndef _AIC7XXX_LINUX_H_
  #define _AIC7XXX_LINUX_H_

-#include <linux/types.h>
-#include <linux/blk.h>
-#include <linux/blkdev.h>
-#include <linux/delay.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/smp_lock.h>
  #include <linux/version.h>
-#include <linux/module.h>
-#include <asm/byteorder.h>
-#include <asm/io.h>

  #ifndef KERNEL_VERSION
  #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
@@ -77,26 +67,8 @@

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  #include <linux/config.h>
-#include <linux/slab.h>
-#else
-#include <linux/malloc.h>
-#endif
-
-/* Core SCSI definitions */
-#define AIC_LIB_PREFIX ahc
-#define AIC_CONST_PREFIX AHC
-#include "scsi.h"
-#include "hosts.h"
-
-/* Name space conflict with BSD queue macros */
-#ifdef LIST_HEAD
-#undef LIST_HEAD
  #endif

-#include "cam.h"
-#include "queue.h"
-#include "scsi_message.h"
-
  /*********************************** Debugging ********************************/
  #ifdef CONFIG_AIC7XXX_DEBUG_ENABLE
  #ifdef CONFIG_AIC7XXX_DEBUG_MASK
@@ -111,6 +83,19 @@
  /* No debugging code. */
  #endif

+/********************************** Includes **********************************/
+/* Core SCSI definitions */
+#define AIC_LIB_PREFIX ahc
+#define AIC_CONST_PREFIX AHC
+
+#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
+#define AIC_DEBUG_REGISTERS 1
+#else
+#define AIC_DEBUG_REGISTERS 0
+#endif
+#define	AIC_CORE_INCLUDE "aic7xxx.h"
+#include "aiclib.h"
+
  /************************* Configuration Data *********************************/
  extern u_int aic7xxx_no_probe;
  extern u_int aic7xxx_allow_memio;
@@ -121,15 +106,6 @@
  void ahc_linux_dv_complete(Scsi_Cmnd *cmd);
  void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);

-/********************************** Includes **********************************/
-#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
-#define AIC_DEBUG_REGISTERS 1
-#else
-#define AIC_DEBUG_REGISTERS 0
-#endif
-#define	AIC_CORE_INCLUDE "aic7xxx.h"
-#include "aiclib.h"
-
  /***************************** SMP support ************************************/
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
  #include <linux/spinlock.h>
@@ -143,7 +119,7 @@
  #define AHC_SCSI_HAS_HOST_LOCK 0
  #endif

-#define AIC7XXX_DRIVER_VERSION "6.3.2"
+#define AIC7XXX_DRIVER_VERSION "6.3.3"

  /********************* Definitions Required by the Core ***********************/
  /*
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#51 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c ====
--- /tmp/tmp.26656.13	2004-09-27 13:16:37.609216808 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	2003-10-31 18:32:05.000000000 -0500
@@ -36,7 +36,7 @@
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#51 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#52 $
   */

  #include "aic7xxx_osm.h"
@@ -79,10 +79,10 @@
  MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table);

  struct pci_driver aic7xxx_pci_driver = {
-	name:		"aic7xxx",
-	probe:		ahc_linux_pci_dev_probe,
-	remove:		ahc_linux_pci_dev_remove,
-	id_table:	ahc_linux_pci_id_table
+	.name		= "aic7xxx",
+	.probe		= ahc_linux_pci_dev_probe,
+	.remove		= ahc_linux_pci_dev_remove,
+	.id_table	= ahc_linux_pci_id_table
  };

  static void
@@ -118,7 +118,7 @@
  	char		 buf[80];
  	bus_addr_t	 mask_39bit;
  	struct		 ahc_softc *ahc;
-	aic_dev_softc_t	 pci;
+	aic_dev_softc_t	 dev;
  	struct		 ahc_pci_identity *entry;
  	char		*name;
  	int		 error;
@@ -129,7 +129,7 @@
  	TAILQ_FOREACH(ahc, &ahc_tailq, links) {
  		struct pci_dev *probed_pdev;

-		probed_pdev = ahc->dev_softc;
+		probed_pdev = aic_dev_to_pci_dev(ahc->dev_softc);
  		if (probed_pdev->bus->number == pdev->bus->number
  		 && probed_pdev->devfn == pdev->devfn)
  			break;
@@ -139,8 +139,8 @@
  		return (-ENODEV);
  	}

-	pci = pdev;
-	entry = ahc_find_pci_device(pci);
+	dev = aic_pci_dev_to_dev(pdev);
+	entry = ahc_find_pci_device(dev);
  	if (entry == NULL)
  		return (-ENODEV);

@@ -150,9 +150,9 @@
  	 * common detect routine.
  	 */
  	sprintf(buf, "ahc_pci:%d:%d:%d",
-		aic_get_pci_bus(pci),
-		aic_get_pci_slot(pci),
-		aic_get_pci_function(pci));
+		aic_get_pci_bus(dev),
+		aic_get_pci_slot(dev),
+		aic_get_pci_function(dev));
  	name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
  	if (name == NULL)
  		return (-ENOMEM);
@@ -160,6 +160,8 @@
  	ahc = ahc_alloc(NULL, name);
  	if (ahc == NULL)
  		return (-ENOMEM);
+	ahc->dev_softc = dev;
+
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  	if (pci_enable_device(pdev)) {
  		ahc_free(ahc);
@@ -170,15 +172,14 @@
  	mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
  	if (sizeof(bus_addr_t) > 4
  	 && ahc_linux_get_memsize() > 0x80000000
-	 && aic_pci_set_dma_mask(pdev, mask_39bit) == 0) {
+	 && aic_set_dma_mask(ahc, mask_39bit) == 0) {
  		ahc->flags |= AHC_39BIT_ADDRESSING;
  		ahc->platform_data->hw_dma_mask = mask_39bit;
  	} else {
-		aic_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+		aic_set_dma_mask(ahc, 0xFFFFFFFF);
  		ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
  	}
  #endif
-	ahc->dev_softc = pci;
  	error = ahc_pci_config(ahc, entry);
  	if (error != 0) {
  		ahc_free(ahc);
@@ -217,10 +218,8 @@
  	pdev = NULL;
  	class = PCI_CLASS_STORAGE_SCSI << 8;
  	while ((pdev = pci_find_class(class, pdev)) != NULL) {
-		aic_dev_softc_t pci;
  		int error;

-		pci = pdev;
  		error = ahc_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
  		if (error == 0)
  			found++;
@@ -242,7 +241,7 @@
  		return (ENOMEM);

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-	*base = pci_resource_start(ahc->dev_softc, 0);
+	*base = pci_resource_start(aic_pci_dev(ahc), 0);
  #else
  	*base = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
  	*base &= PCI_BASE_ADDRESS_IO_MASK;
@@ -272,7 +271,7 @@

  	error = 0;
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-	start = pci_resource_start(ahc->dev_softc, 1);
+	start = pci_resource_start(aic_pci_dev(ahc), 1);
  	base_page = start & PAGE_MASK;
  	base_offset = start - base_page;
  #else
@@ -382,10 +381,10 @@
  {
  	int error;

-	error = request_irq(ahc->dev_softc->irq, ahc_linux_isr,
+	error = request_irq(aic_pci_dev(ahc)->irq, ahc_linux_isr,
  			    SA_SHIRQ, "aic7xxx", ahc);
  	if (error == 0)
-		ahc->platform_data->irq = ahc->dev_softc->irq;
+		ahc->platform_data->irq = aic_pci_dev(ahc)->irq;
  	
  	return (-error);
  }
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_reg.h#28 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped ====
--- /tmp/tmp.26656.14	2004-09-27 13:16:37.835182456 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped	2003-11-03 15:03:57.000000000 -0500
@@ -3,7 +3,7 @@
   *		 from the following source files:
   *
   * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
   */
  typedef int (ahc_reg_print_t)(u_int, u_int *, u_int);
  typedef struct ahc_reg_parse_entry {
@@ -1298,7 +1298,6 @@
  #define	CMDSIZE_TABLE_TAIL		0x34

  #define	MWI_RESIDUAL    		0x38
-#define	TARG_IMMEDIATE_SCB		0x38

  #define	NEXT_QUEUED_SCB 		0x39

@@ -1380,6 +1379,7 @@
  #define	RETURN_2        		0x52

  #define	LAST_MSG        		0x53
+#define	TARG_IMMEDIATE_SCB		0x53

  #define	SCSISEQ_TEMPLATE		0x54
  #define		ENSELO          	0x40
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_reg_print.c#15 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped ====
--- /tmp/tmp.26656.15	2004-09-27 13:16:38.064147648 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped	2003-11-03 15:03:57.000000000 -0500
@@ -3,7 +3,7 @@
   *		 from the following source files:
   *
   * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
   */

  #include "aic7xxx_osm.h"
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_seq.h#29 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped ====
--- /tmp/tmp.26656.16	2004-09-27 13:16:38.249119528 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped	2003-11-03 15:03:57.000000000 -0500
@@ -3,7 +3,7 @@
   *		 from the following source files:
   *
   * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
   */
  static uint8_t seqprog[] = {
  	0xb2, 0x00, 0x00, 0x08,
@@ -155,12 +155,12 @@
  	0x04, 0x3c, 0x92, 0x69,
  	0x02, 0x3c, 0x98, 0x69,
  	0x01, 0x3c, 0x44, 0x79,
-	0xff, 0x6a, 0x70, 0x00,
+	0xff, 0x6a, 0xa6, 0x00,
  	0x00, 0x65, 0xa4, 0x59,
  	0x00, 0x6a, 0xc2, 0x5e,
-	0xff, 0x38, 0x30, 0x71,
+	0xff, 0x53, 0x30, 0x71,
  	0x0d, 0x6a, 0x76, 0x00,
-	0x00, 0x38, 0x14, 0x5e,
+	0x00, 0x53, 0x14, 0x5e,
  	0x00, 0x65, 0xea, 0x58,
  	0x12, 0x01, 0x02, 0x00,
  	0x00, 0x65, 0x18, 0x41,
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.c#14 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c ====
--- /tmp/tmp.26656.17	2004-09-27 13:16:38.644059488 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c	2003-10-31 19:04:09.000000000 -0500
@@ -30,17 +30,6 @@
   * $Id$
   */

-#include <linux/blk.h>
-#include <linux/blkdev.h>
-#include <linux/delay.h>
-#include <linux/version.h>
-
-/* Core SCSI definitions */
-#include "scsi.h"
-#include "hosts.h"
-#include "aiclib.h"
-#include "cam.h"
-
  #ifndef FALSE
  #define FALSE   0
  #endif /* FALSE */
@@ -1414,8 +1403,12 @@

  /************************* Magic SysReq Support *******************************/
  void
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
  aic_sysrq_handler(int key, struct pt_regs *unused, struct kbd_struct *unused1,
  		  struct tty_struct *unused2)
+#else
+aic_sysrq_handler(int key, struct pt_regs *unused, struct tty_struct *unused2)
+#endif
  {
  #ifdef CONFIG_MAGIC_SYSRQ
  	struct aic_softc *aic;
@@ -1508,34 +1501,19 @@
  {
  	bus_dmamap_t map;

-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  	map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
  	if (map == NULL)
  		return (ENOMEM);
  	/*
  	 * Although we can dma data above 4GB, our
-	 * "consistent" memory is below 4GB for
+	 * coherent memory is below 4GB for
  	 * space efficiency reasons (only need a 4byte
  	 * address).  For this reason, we have to reset
  	 * our dma mask when doing allocations.
  	 */
-	if (aic->dev_softc != NULL)
-		aic_pci_set_dma_mask(aic->dev_softc, 0xFFFFFFFF);
-	*vaddr = pci_alloc_consistent(aic->dev_softc,
-				      dmat->maxsize, &map->bus_addr);
-	if (aic->dev_softc != NULL)
-		aic_pci_set_dma_mask(aic->dev_softc,
-				     aic->platform_data->hw_dma_mask);
-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
-	/*
-	 * At least in 2.2.14, malloc is a slab allocator so all
-	 * allocations are aligned.  We assume for these kernel versions
-	 * that all allocations will be bellow 4Gig, physically contiguous,
-	 * and accessible via DMA by the controller.
-	 */
-	map = NULL; /* No additional information to store */
-	*vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
-#endif
+	aic_set_dma_mask(aic, 0xFFFFFFFF);
+	*vaddr = aic_alloc_coherent(aic, dmat->maxsize, &map->bus_addr);
+	aic_set_dma_mask(aic, aic->platform_data->hw_dma_mask);
  	if (*vaddr == NULL)
  		return (ENOMEM);
  	*mapp = map;
@@ -1547,8 +1525,7 @@
  		void* vaddr, bus_dmamap_t map)
  {
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-	pci_free_consistent(aic->dev_softc, dmat->maxsize,
-			    vaddr, map->bus_addr);
+	aic_free_coherent(aic, dmat->maxsize, vaddr, map->bus_addr);
  #else
  	free(vaddr, M_DEVBUF);
  #endif
@@ -1565,12 +1542,7 @@
  	 */
  	bus_dma_segment_t stack_sg;

-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  	stack_sg.ds_addr = map->bus_addr;
-#else
-#define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
-	stack_sg.ds_addr = VIRT_TO_BUS(buf);
-#endif
  	stack_sg.ds_len = dmat->maxsize;
  	cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
  	return (0);
@@ -1579,11 +1551,7 @@
  void
  aic_dmamap_destroy(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map)
  {
-	/*
-	 * The map may is NULL in our < 2.3.X implementation.
-	 */
-	if (map != NULL)
-		free(map, M_DEVBUF);
+	free(map, M_DEVBUF);
  }

  int
@@ -1724,14 +1692,14 @@
  			 * If the command is still sitting on
  			 * our completion queue, just re-instate
  			 * the timeout.  If we've already completed
-			 * the command, done_late will be set and
-			 * we will need to additionally complete it
-			 * again to the mid-layer.
+			 * the command, the function pointer in our
+			 * timer will be cleared and we will need to
+			 * additionally complete it again to the mid-layer.
  			 *
  			 * Since done_late is cleared by adding a
  			 * timer, we must save off its value first.
  			 */
-			done_late = cmd->done_late;
+			done_late = cmd->eh_timeout.function == NULL;
  			scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
  			if (done_late)
  				cmd->scsi_done(cmd);
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.h#20 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h ====
--- /tmp/tmp.26656.18	2004-09-27 13:16:39.007004312 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h	2003-11-04 16:24:29.000000000 -0500
@@ -58,10 +58,42 @@
  #ifndef	_AICLIB_H
  #define _AICLIB_H

+#include <linux/types.h>
+#include <linux/delay.h>
+#include <linux/ioport.h>
+#include <linux/pci.h>
+#include <linux/smp_lock.h>
+#include <linux/module.h>
+#include <asm/byteorder.h>
+#include <asm/io.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
+#include <linux/slab.h>
+#else
+#include <linux/malloc.h>
+#endif
+
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  #include <linux/interrupt.h> /* For tasklet support. */
  #endif

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#include <linux/blk.h>
+#endif
+#include <linux/blkdev.h>
+
+#include "scsi.h"
+#include "hosts.h"
+
+/* Name space conflict with BSD queue macros */
+#ifdef LIST_HEAD
+#undef LIST_HEAD
+#endif
+#include "cam.h"
+#include "queue.h"
+#include "scsi_message.h"
+#include "scsi_iu.h"
+
  /*
   * Linux Interrupt Support.
   */
@@ -153,8 +185,13 @@

  /*************************** Forward Declarations *****************************/
  struct aic_softc;
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+typedef struct device *aic_dev_softc_t;
+#else
  typedef struct pci_dev *aic_dev_softc_t;
-typedef Scsi_Cmnd      *aic_io_ctx_t;
+#endif
+typedef Scsi_Cmnd     *aic_io_ctx_t;

  /*************************** Timer DataStructures *****************************/
  typedef struct timer_list aic_timer_t;
@@ -258,6 +295,165 @@
   */
  #define aic_dmamap_sync(aic, dma_tag, dmamap, offset, len, op)

+/*************************** Linux DMA Wrappers *******************************/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#define	aic_alloc_coherent(aic, size, bus_addr_ptr) \
+	dma_alloc_coherent(aic->dev_softc, size, bus_addr_ptr, /*flag*/0)
+
+#define	aic_free_coherent(aic, size, vaddr, bus_addr) \
+	dma_free_coherent(aic->dev_softc, size, vaddr, bus_addr)
+
+#define	aic_map_single(aic, buf, size, direction) \
+	dma_map_single(aic->dev_softc, buf, size, direction)
+
+#define	aic_unmap_single(aic, busaddr, size, direction) \
+	dma_unmap_single(aic->dev_softc, busaddr, size, direction)
+
+#define	aic_map_sg(aic, sg_list, num_sg, direction) \
+	dma_map_sg(aic->dev_softc, sg_list, num_sg, direction)
+
+#define	aic_unmap_sg(aic, sg_list, num_sg, direction) \
+	dma_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
+
+#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
+
+#define	aic_alloc_coherent(aic, size, bus_addr_ptr) \
+	pci_alloc_consistent(aic->dev_softc, size, bus_addr_ptr)
+
+#define	aic_free_coherent(aic, size, vaddr, bus_addr) \
+	pci_free_consistent(aic->dev_softc, size, vaddr, bus_addr)
+
+#define	aic_map_single(aic, buf, size, direction) \
+	pci_map_single(aic->dev_softc, buf, size, direction)
+
+#define	aic_unmap_single(aic, busaddr, size, direction) \
+	pci_unmap_single(aic->dev_softc, busaddr, size, direction)
+
+#define	aic_map_sg(aic, sg_list, num_sg, direction) \
+	pci_map_sg(aic->dev_softc, sg_list, num_sg, direction)
+
+#define	aic_unmap_sg(aic, sg_list, num_sg, direction) \
+	pci_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
+
+#else
+
+static __inline void *aic_alloc_coherent(struct aic_softc *aic,
+					 bus_size_t size, bus_addr_t *baddrp);
+
+/*
+ * At least in 2.2.14, malloc is a slab allocator so all
+ * allocations are aligned.  We assume for these kernel versions
+ * that all allocations will be bellow 4Gig, physically contiguous,
+ * and accessible via DMA by the controller.
+ */
+static __inline void *
+aic_alloc_coherent(struct aic_softc *aic, bus_size_t size, bus_addr_t *baddrp)
+{
+	void *vaddr;
+
+	vaddr_ = malloc(size, M_DEVBUF, M_NOWAIT);
+	if (vaddr != NULL)
+		*baddrp = virt_to_bus(vaddr);
+	return (vaddr);
+}
+
+#define	aic_free_coherent(aic, size, vaddr, bus_addr) \
+	free(vaddr, M_DEVBUF)
+
+#define aic_map_sg(pdev, sg_list, nseg, direction) (nseg)
+#define aic_unmap_sg(pdev, sg_list, nseg, direction)
+#define aic_map_single(pdev, buffer, bufflen, direction) \
+	(VIRT_TO_BUS(buffer))
+#define aic_unmap_single(pdev, buffer, buflen, direction)
+#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
+#define sg_dma_len(sg) ((sg)->length)
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+
+#define aic_set_dma_mask(aic, mask) dma_set_mask(aic->dev_softc, mask)
+
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
+
+/*
+ * Device softc is NULL for EISA devices.
+ */
+#define aic_set_dma_mask(aic, mask) 			\
+	((aic)->dev_softc == NULL ? 0 : pci_set_dma_mask(aic->dev_softc, mask))
+
+#else
+/*
+ * Device softc is NULL for EISA devices.
+ * Always "return" 0 for success.
+ */
+#define aic_set_dma_mask(aic, mask)			\
+    (((aic)->dev_softc == NULL)				\
+     ? 0						\
+     : (((aic)->dev_softc->dma_mask = mask) && 0))
+#endif
+
+/************************* Host Template Macros *******************************/
+#if defined CONFIG_HIGHIO
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
+/* Assume RedHat Distribution with its different HIGHIO conventions. */
+#define	AIC_TEMPLATE_DMA_SETTINGS()	\
+	.can_dma_32		= 1,	\
+	.single_sg_okay		= 1,
+#else
+#define	AIC_TEMPLATE_DMA_SETTINGS()	\
+	.highmem_io		= 1,
+#endif
+#else
+#define	AIC_TEMPLATE_DMA_SETTINGS()
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
+#define	AIC_TEMPLATE_MAX_SECTORS(sectors) \
+	.max_sectors		= (sectors),
+#else
+#define	AIC_TEMPLATE_MAX_SECTORS(sectors)
+#endif
+
+#if defined(__i386__)
+#define	AIC_TEMPLATE_BIOSPARAM() \
+	.bios_param		= AIC_LIB_ENTRY(_linux_biosparam),
+#else
+#define	AIC_TEMPLATE_BIOSPARAM()
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#define	AIC_TEMPLATE_VERSIONED_ENTRIES() \
+	.slave_alloc		= AIC_LIB_ENTRY(_linux_slave_alloc), \
+	.slave_configure	= AIC_LIB_ENTRY(_linux_slave_configure), \
+	.slave_destroy		= AIC_LIB_ENTRY(_linux_slave_destroy)
+#else
+#define	AIC_TEMPLATE_VERSIONED_ENTRIES() \
+	.detect			= AIC_LIB_ENTRY(_linux_detect), \
+	.release		= AIC_LIB_ENTRY(_linux_release), \
+	.select_queue_depths	= AIC_LIB_ENTRY(_linux_select_queue_depth), \
+	.use_new_eh_code	= 1
+#endif
+
+#define AIC_TEMPLATE_INITIALIZER(NAME, MAX_SECTORS)			\
+{									\
+	.module			= THIS_MODULE,				\
+	.name			= NAME,					\
+	.proc_info		= AIC_LIB_ENTRY(_linux_proc_info),	\
+	.info			= AIC_LIB_ENTRY(_linux_info),		\
+	.queuecommand		= AIC_LIB_ENTRY(_linux_queue),		\
+	.eh_abort_handler	= AIC_LIB_ENTRY(_linux_abort),		\
+	.eh_device_reset_handler = AIC_LIB_ENTRY(_linux_dev_reset),	\
+	.eh_bus_reset_handler	= AIC_LIB_ENTRY(_linux_bus_reset),	\
+	.can_queue		= AIC_CONST_ENTRY(_MAX_QUEUE),		\
+	.this_id		= -1,					\
+	.cmd_per_lun		= 2,					\
+	.use_clustering		= ENABLE_CLUSTERING,			\
+	AIC_TEMPLATE_MAX_SECTORS(MAX_SECTORS)				\
+	AIC_TEMPLATE_DMA_SETTINGS()					\
+	AIC_TEMPLATE_BIOSPARAM()					\
+	AIC_TEMPLATE_VERSIONED_ENTRIES()				\
+}
+
  /************************** OS Utility Wrappers *******************************/
  #define printf printk
  #define M_NOWAIT GFP_ATOMIC
@@ -1686,10 +1882,25 @@
  #define PCIXM_STATUS_MAXCRDS	0x1C00	/* Maximum Cumulative Read Size */
  #define PCIXM_STATUS_RCVDSCEM	0x2000	/* Received a Split Comp w/Error msg */

-/******************************* PCI Routines *********************************/
-static __inline uint32_t aic_pci_read_config(aic_dev_softc_t pci,
+/**************************** KObject Wrappers ********************************/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#define	aic_dev_to_pci_dev(dev)		to_pci_dev(dev)
+#define	aic_dev_to_eisa_dev(dev)	to_eisa_dev(dev)
+#define	aic_pci_dev_to_dev(pci)		(&pci->dev)
+#define	aic_eisa_dev_to_dev(eisa)	(&eisa->dev)
+#else
+#define	aic_dev_to_pci_dev(dev)		(dev)
+#define	aic_dev_to_eisa_dev(dev)	(NULL)
+#define	aic_pci_dev_to_dev(pci)		(pci)
+#define	aic_eisa_dev_to_dev(eisa)	(NULL)
+#endif
+
+#define	aic_pci_dev(aic)		aic_dev_to_pci_dev((aic)->dev_softc)
+#define	aic_eisa_dev(aic)		aic_dev_to_eisa_dev((aic)->dev_softc)
+/***************************** PCI Routines ***********************************/
+static __inline uint32_t aic_pci_read_config(aic_dev_softc_t dev,
  					     int reg, int width);
-static __inline void aic_pci_write_config(aic_dev_softc_t pci,
+static __inline void aic_pci_write_config(aic_dev_softc_t dev,
  					  int reg, uint32_t value,
  					  int width);
  static __inline int aic_get_pci_function(aic_dev_softc_t);
@@ -1697,8 +1908,11 @@
  static __inline int aic_get_pci_bus(aic_dev_softc_t);

  static __inline uint32_t
-aic_pci_read_config(aic_dev_softc_t pci, int reg, int width)
+aic_pci_read_config(aic_dev_softc_t dev, int reg, int width)
  {
+	struct pci_dev *pci;
+
+	pci = aic_dev_to_pci_dev(dev);
  	switch (width) {
  	case 1:
  	{
@@ -1727,8 +1941,11 @@
  }

  static __inline void
-aic_pci_write_config(aic_dev_softc_t pci, int reg, uint32_t value, int width)
+aic_pci_write_config(aic_dev_softc_t dev, int reg, uint32_t value, int width)
  {
+	struct pci_dev *pci;
+
+	pci = aic_dev_to_pci_dev(dev);
  	switch (width) {
  	case 1:
  		pci_write_config_byte(pci, reg, value);
@@ -1746,42 +1963,32 @@
  }

  static __inline int
-aic_get_pci_function(aic_dev_softc_t pci)
+aic_get_pci_function(aic_dev_softc_t dev)
  {
+	struct pci_dev *pci;
+
+	pci = aic_dev_to_pci_dev(dev);
  	return (PCI_FUNC(pci->devfn));
  }

  static __inline int
-aic_get_pci_slot(aic_dev_softc_t pci)
+aic_get_pci_slot(aic_dev_softc_t dev)
  {
+	struct pci_dev *pci;
+
+	pci = aic_dev_to_pci_dev(dev);
  	return (PCI_SLOT(pci->devfn));
  }

  static __inline int
-aic_get_pci_bus(aic_dev_softc_t pci)
+aic_get_pci_bus(aic_dev_softc_t dev)
  {
+	struct pci_dev *pci;
+
+	pci = aic_dev_to_pci_dev(dev);
  	return (pci->bus->number);
  }

-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)
-#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)
-#define pci_unmap_sg(pdev, sg_list, nseg, direction)
-#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
-#define sg_dma_len(sg) ((sg)->length)
-#define pci_map_single(pdev, buffer, bufflen, direction) \
-	(VIRT_TO_BUS(buffer))
-#define pci_unmap_single(pdev, buffer, buflen, direction)
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
-#define aic_pci_set_dma_mask pci_set_dma_mask
-#else
-/*
- * Always "return" 0 for success.
- */
-#define aic_pci_set_dma_mask(dev_softc, mask)	\
-	(((dev_softc)->dma_mask = mask) && 0)
-#endif
  /************************* Large Disk Handling ********************************/
  #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
  static __inline int aic_sector_div(u_long capacity, int heads, int sectors);
@@ -1806,23 +2013,27 @@
  /************************* Magic SysReq Support *******************************/
  #include <linux/sysrq.h>

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct kbd_struct *,
+				  struct tty_struct *);
+#else
+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct tty_struct *);
+#endif
+
  #ifdef CONFIG_MAGIC_SYSRQ
-#define aic_sysrq_key_op sysrq_key_op
+#define	aic_sysrq_key_op sysrq_key_op
  #else
  struct aic_sysrq_key_op {
-	void (*handler)(int, struct pt_regs *, struct kbd_struct *,
-			struct tty_struct *);
+	aic_sysrq_handler_t *handler;
  	char *help_msg;
  	char *action_msg;
  };
  #endif
-void			aic_sysrq_handler(int, struct pt_regs *,
-					  struct kbd_struct *,
-					  struct tty_struct *);
+
+aic_sysrq_handler_t	aic_sysrq_handler;
  int			aic_install_sysrq(struct aic_sysrq_key_op *);
  void			aic_remove_sysrq(int key,
  					 struct aic_sysrq_key_op *key_op);
-
  /************************ SCSI Library Functions *****************************/
  void			aic_sense_desc(int /*sense_key*/, int /*asc*/,
  				       int /*ascq*/, struct scsi_inquiry_data*,
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib_pci.c#1 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib_pci.c ====
--- /tmp/tmp.26656.19	2004-09-27 13:16:39.156981512 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib_pci.c	2003-10-31 17:16:10.000000000 -0500
@@ -43,7 +43,7 @@
  aic_power_state_change(struct aic_softc *aic, aic_power_state new_state)
  {
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-	pci_set_power_state(aic->dev_softc, new_state);
+	pci_set_power_state(aic_dev_to_pci_dev(aic->dev_softc), new_state);
  #else
  	uint32_t cap;
  	u_int cap_offset;



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-09-28 13:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-09-28 13:06 [patch 14/28] Sync up drivers/scsi/aic7xxx Luben Tuikov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).