* [patch 13/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/. (2396-2437)
Signed-off-by: Luben Tuikov <luben_tuikov@adaptec.com>
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#14 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770_osm.c ====
--- /tmp/tmp.26602.0 2004-09-27 13:12:54.008209328 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7770_osm.c 2003-10-21 16:28:58.000000000 -0400
@@ -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#14 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#15 $
*/
#include "aic7xxx_osm.h"
@@ -267,12 +267,14 @@
if (ahc != NULL) {
u_long s;
+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
+ ahc_list_unlock(&l);
ahc_lock(ahc, &s);
ahc_intr_enable(ahc, FALSE);
ahc_unlock(ahc, &s);
ahc_free(ahc);
- }
- ahc_list_unlock(&l);
+ } else
+ ahc_list_unlock(&l);
return (0);
}
==== //depot/aic7xxx/aic7xxx/aic79xx.seq#104 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx.seq ====
--- /tmp/tmp.26602.1 2004-09-27 13:12:54.539128616 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx.seq 2003-10-22 16:44:45.000000000 -0400
@@ -40,7 +40,7 @@
* $FreeBSD$
*/
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#104 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#105 $"
PATCH_ARG_LIST = "struct ahd_softc *ahd"
PREFIX = "ahd_"
@@ -1701,7 +1701,7 @@
test DFCNTRL, DIRECTION jz interrupt_return;
and DFCNTRL, ~SCSIEN;
snapshot_wait_data_valid:
- test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz snapshot_data_valid;
+ test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz interrupt_return;
test SSTAT1, REQINIT jz snapshot_wait_data_valid;
snapshot_data_valid:
or DFCNTRL, SCSIEN;
==== //depot/aic7xxx/aic7xxx/aic79xx.c#217 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_core.c ====
--- /tmp/tmp.26602.2 2004-09-27 13:12:56.345853952 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_core.c 2003-10-21 17:17:19.000000000 -0400
@@ -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#217 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#219 $
*
* $FreeBSD$
*/
@@ -5176,24 +5176,24 @@
{
struct ahd_softc *list_ahd;
-#if AHD_PCI_CONFIG > 0
+#if AIC_PCI_CONFIG > 0
/*
* Second Function PCI devices need to inherit some
* settings from function 0.
*/
if ((ahd->features & AHD_MULTI_FUNC) != 0) {
TAILQ_FOREACH(list_ahd, &ahd_tailq, links) {
- ahd_dev_softc_t list_pci;
- ahd_dev_softc_t pci;
+ aic_dev_softc_t list_pci;
+ aic_dev_softc_t pci;
list_pci = list_ahd->dev_softc;
pci = ahd->dev_softc;
- if (ahd_get_pci_slot(list_pci) == ahd_get_pci_slot(pci)
- && ahd_get_pci_bus(list_pci) == ahd_get_pci_bus(pci)) {
+ if (aic_get_pci_slot(list_pci) == aic_get_pci_slot(pci)
+ && aic_get_pci_bus(list_pci) == aic_get_pci_bus(pci)) {
struct ahd_softc *master;
struct ahd_softc *slave;
- if (ahd_get_pci_function(list_pci) == 0) {
+ if (aic_get_pci_function(list_pci) == 0) {
master = list_ahd;
slave = ahd;
} else {
@@ -5263,7 +5263,6 @@
default:
case 5:
ahd_shutdown(ahd);
- TAILQ_REMOVE(&ahd_tailq, ahd, links);
/* FALLTHROUGH */
case 4:
aic_dmamap_unload(ahd, ahd->shared_data_dmat,
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#182 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c ====
--- /tmp/tmp.26602.3 2004-09-27 13:12:57.160730072 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-10-28 15:06:33.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Adaptec AIC79xx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#182 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#188 $
*
* --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -719,7 +719,7 @@
* number of segments needed for the current transfer. Since the code that
* sizes the SCSI malloc pool does not take into consideration fragmentation
* of the pool, executing transactions numbering just a fraction of our
- * concurrent transaction limit with SG list lengths aproaching AHC_NSEG will
+ * concurrent transaction limit with SG list lengths aproaching AHD_NSEG will
* quickly depleat the SCSI malloc pool of usable space. Unfortunately, the
* mid-layer does not properly handle this scsi malloc failures for the S/G
* array and the result can be a lockup of the I/O subsystem. We try to size
@@ -1019,7 +1019,6 @@
struct ahd_softc *ahd;
u_long l;
- ahd_list_lock(&l);
if (host != NULL) {
/*
@@ -1027,17 +1026,20 @@
* the free directly, but check our
* list for extra sanity.
*/
+ ahd_list_lock(&l);
ahd = ahd_find_softc(*(struct ahd_softc **)host->hostdata);
if (ahd != NULL) {
u_long s;
+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
+ ahd_list_unlock(&l);
ahd_lock(ahd, &s);
ahd_intr_enable(ahd, FALSE);
ahd_unlock(ahd, &s);
ahd_free(ahd);
- }
+ } else
+ ahd_list_unlock(&l);
}
- ahd_list_unlock(&l);
return (0);
}
#endif
@@ -1854,19 +1856,19 @@
/* Still equal. Sort by bus/slot/func. */
if (aic79xx_reverse_scan != 0)
- value = ahd_get_pci_bus(lahd->dev_softc)
- - ahd_get_pci_bus(rahd->dev_softc);
+ value = aic_get_pci_bus(lahd->dev_softc)
+ - aic_get_pci_bus(rahd->dev_softc);
else
- value = ahd_get_pci_bus(rahd->dev_softc)
- - ahd_get_pci_bus(lahd->dev_softc);
+ value = aic_get_pci_bus(rahd->dev_softc)
+ - aic_get_pci_bus(lahd->dev_softc);
if (value != 0)
return (value);
if (aic79xx_reverse_scan != 0)
- value = ahd_get_pci_slot(lahd->dev_softc)
- - ahd_get_pci_slot(rahd->dev_softc);
+ value = aic_get_pci_slot(lahd->dev_softc)
+ - aic_get_pci_slot(rahd->dev_softc);
else
- value = ahd_get_pci_slot(rahd->dev_softc)
- - ahd_get_pci_slot(lahd->dev_softc);
+ value = aic_get_pci_slot(rahd->dev_softc)
+ - aic_get_pci_slot(lahd->dev_softc);
if (value != 0)
return (value);
@@ -2054,8 +2056,12 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
scsi_assign_lock(host, &ahd->platform_data->spin_lock);
#elif AHD_SCSI_HAS_HOST_LOCK != 0
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
+ host->host_lock = &ahd->platform_data->spin_lock;
+#else
host->lock = &ahd->platform_data->spin_lock;
#endif
+#endif
ahd->platform_data->host = host;
host->can_queue = AHD_MAX_QUEUE;
host->cmd_per_lun = 2;
@@ -2202,17 +2208,6 @@
ahd_update_neg_request(ahd, &devinfo, tstate,
tinfo, AHD_NEG_ALWAYS);
}
- /* Give the bus some time to recover */
- if ((ahd->flags & AHD_RESET_BUS_A) != 0) {
- aic_freeze_simq(ahd);
- init_timer(&ahd->platform_data->reset_timer);
- ahd->platform_data->reset_timer.data = (u_long)ahd;
- ahd->platform_data->reset_timer.expires =
- jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
- ahd->platform_data->reset_timer.function =
- (aic_linux_callback_t *)aic_release_simq;
- add_timer(&ahd->platform_data->reset_timer);
- }
}
int
@@ -2229,6 +2224,10 @@
ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
ahd_lockinit(ahd);
ahd_done_lockinit(ahd);
+ init_timer(&ahd->platform_data->bus_settle_timer);
+ ahd->platform_data->bus_settle_timer.data = (u_long)ahd;
+ ahd->platform_data->bus_settle_timer.function =
+ (aic_linux_callback_t *)aic_bus_settle_complete;
init_timer(&ahd->platform_data->completeq_timer);
ahd->platform_data->completeq_timer.data = (u_long)ahd;
ahd->platform_data->completeq_timer.function =
@@ -3196,7 +3195,17 @@
}
#endif
if (echo_size == 0) {
- AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
+ /*
+ * Fall back to basic DV.
+ */
+ if (bootverbose) {
+ ahd_print_devinfo(ahd, devinfo);
+ printf("Echo Buffer unavailable. "
+ "Performing basic DV.\n");
+ }
+ targ->flags &= ~AIC_ENHANCED_DV;
+ targ->flags |= AIC_BASIC_DV;
+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_TUR);
break;
}
@@ -3778,17 +3787,6 @@
aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
ahd_reset_channel(ahd, cmd->device->channel + 'A', /*initiate*/TRUE);
- /*
- * Add a minimal bus settle delay for devices that are slow to
- * respond after bus resets.
- */
- aic_freeze_simq(ahd);
- init_timer(&ahd->platform_data->reset_timer);
- ahd->platform_data->reset_timer.data = (u_long)ahd;
- ahd->platform_data->reset_timer.expires = jiffies + HZ / 2;
- ahd->platform_data->reset_timer.function =
- (aic_linux_callback_t *)aic_release_simq;
- add_timer(&ahd->platform_data->reset_timer);
if (aic_linux_next_device_to_run(ahd) != NULL)
aic_schedule_runq(ahd);
ahd_linux_run_complete_queue(ahd);
@@ -4401,6 +4399,20 @@
channel - 'A');
}
#endif
+ /*
+ * Add a minimal bus settle delay for devices that are slow to
+ * respond after bus resets.
+ */
+ if ((ahd->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
+ aic_freeze_simq(ahd);
+ ahd->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
+ ahd->platform_data->bus_settle_timer.expires =
+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
+ add_timer(&ahd->platform_data->bus_settle_timer);
+ } else {
+ mod_timer(&ahd->platform_data->bus_settle_timer,
+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000);
+ }
break;
default:
panic("ahd_send_async: Unexpected async event");
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#147 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h ====
--- /tmp/tmp.26602.4 2004-09-27 13:12:57.247716848 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h 2003-10-21 15:48:41.000000000 -0400
@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#147 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#149 $
*
*/
#ifndef _AIC79XX_LINUX_H_
@@ -96,11 +96,6 @@
/* No debugging code. */
#endif
-/************************* Forward Declarations *******************************/
-struct ahd_softc;
-typedef struct pci_dev *ahd_dev_softc_t;
-typedef Scsi_Cmnd *ahd_io_ctx_t;
-
/************************* Configuration Data *********************************/
extern uint32_t aic79xx_allow_memio;
extern int aic79xx_detect_complete;
@@ -132,7 +127,7 @@
#define AHD_SCSI_HAS_HOST_LOCK 0
#endif
-#define AIC79XX_DRIVER_VERSION "2.0.2"
+#define AIC79XX_DRIVER_VERSION "2.0.3"
/********************* Definitions Required by the Core ***********************/
/*
@@ -168,29 +163,6 @@
void ahd_set_recoveryscb(struct ahd_softc *ahd,
struct scb *scb);
-/************************** OS Utility Wrappers *******************************/
-#define printf printk
-#define M_NOWAIT GFP_ATOMIC
-#define M_WAITOK 0
-#define malloc(size, type, flags) kmalloc(size, flags)
-#define free(ptr, type) kfree(ptr)
-
-static __inline void ahd_delay(long);
-static __inline void
-ahd_delay(long usec)
-{
- /*
- * udelay on Linux can have problems for
- * multi-millisecond waits. Wait at most
- * 1024us per call.
- */
- while (usec > 0) {
- udelay(usec % 1024);
- usec -= 1024;
- }
-}
-
-
/***************************** Low Level I/O **********************************/
static __inline uint8_t ahd_inb(struct ahd_softc * ahd, long port);
static __inline uint16_t ahd_inw_atomic(struct ahd_softc * ahd, long port);
@@ -201,6 +173,7 @@
uint8_t *, int count);
static __inline void ahd_insb(struct ahd_softc * ahd, long port,
uint8_t *, int count);
+static __inline void ahd_flush_device_writes(struct ahd_softc *);
static __inline uint8_t
ahd_inb(struct ahd_softc * ahd, long port)
@@ -280,6 +253,13 @@
*array++ = ahd_inb(ahd, port);
}
+static __inline void
+ahd_flush_device_writes(struct ahd_softc *ahd)
+{
+ /* XXX Is this sufficient for all architectures??? */
+ ahd_inb(ahd, INTSTAT);
+}
+
/**************************** Initialization **********************************/
int ahd_linux_register_host(struct ahd_softc *,
Scsi_Host_Template *);
@@ -418,110 +398,6 @@
int ahd_pci_map_registers(struct ahd_softc *ahd);
int ahd_pci_map_int(struct ahd_softc *ahd);
-static __inline uint32_t ahd_pci_read_config(ahd_dev_softc_t pci,
- int reg, int width);
-
-static __inline uint32_t
-ahd_pci_read_config(ahd_dev_softc_t pci, int reg, int width)
-{
- switch (width) {
- case 1:
- {
- uint8_t retval;
-
- pci_read_config_byte(pci, reg, &retval);
- return (retval);
- }
- case 2:
- {
- uint16_t retval;
- pci_read_config_word(pci, reg, &retval);
- return (retval);
- }
- case 4:
- {
- uint32_t retval;
- pci_read_config_dword(pci, reg, &retval);
- return (retval);
- }
- default:
- panic("ahd_pci_read_config: Read size too big");
- /* NOTREACHED */
- return (0);
- }
-}
-
-static __inline void ahd_pci_write_config(ahd_dev_softc_t pci,
- int reg, uint32_t value,
- int width);
-
-static __inline void
-ahd_pci_write_config(ahd_dev_softc_t pci, int reg, uint32_t value, int width)
-{
- switch (width) {
- case 1:
- pci_write_config_byte(pci, reg, value);
- break;
- case 2:
- pci_write_config_word(pci, reg, value);
- break;
- case 4:
- pci_write_config_dword(pci, reg, value);
- break;
- default:
- panic("ahd_pci_write_config: Write size too big");
- /* NOTREACHED */
- }
-}
-
-static __inline int ahd_get_pci_function(ahd_dev_softc_t);
-static __inline int
-ahd_get_pci_function(ahd_dev_softc_t pci)
-{
- return (PCI_FUNC(pci->devfn));
-}
-
-static __inline int ahd_get_pci_slot(ahd_dev_softc_t);
-static __inline int
-ahd_get_pci_slot(ahd_dev_softc_t pci)
-{
- return (PCI_SLOT(pci->devfn));
-}
-
-static __inline int ahd_get_pci_bus(ahd_dev_softc_t);
-static __inline int
-ahd_get_pci_bus(ahd_dev_softc_t pci)
-{
- return (pci->bus->number);
-}
-
-static __inline void ahd_flush_device_writes(struct ahd_softc *);
-static __inline void
-ahd_flush_device_writes(struct ahd_softc *ahd)
-{
- /* XXX Is this sufficient for all architectures??? */
- ahd_inb(ahd, INTSTAT);
-}
-
-#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 ahd_pci_set_dma_mask pci_set_dma_mask
-#else
-/*
- * Always "return" 0 for success.
- */
-#define ahd_pci_set_dma_mask(dev_softc, mask) \
- (((dev_softc)->dma_mask = mask) && 0)
-#endif
/**************************** Proc FS Support *********************************/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
int ahd_linux_proc_info(char *, char **, off_t, int, int, int);
@@ -552,9 +428,9 @@
void ahd_platform_dump_card_state(struct ahd_softc *ahd);
#ifdef CONFIG_PCI
-#define AHD_PCI_CONFIG 1
+#define AIC_PCI_CONFIG 1
#else
-#define AHD_PCI_CONFIG 0
+#define AIC_PCI_CONFIG 0
#endif
#define bootverbose aic79xx_verbose
extern uint32_t aic79xx_verbose;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#26 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c ====
--- /tmp/tmp.26602.5 2004-09-27 13:12:57.315706512 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2003-10-21 16:30:24.000000000 -0400
@@ -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#26 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#28 $
*/
#include "aic79xx_osm.h"
@@ -98,12 +98,14 @@
if (ahd != NULL) {
u_long s;
+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
+ ahd_list_unlock(&l);
ahd_lock(ahd, &s);
ahd_intr_enable(ahd, FALSE);
ahd_unlock(ahd, &s);
ahd_free(ahd);
- }
- ahd_list_unlock(&l);
+ } else
+ ahd_list_unlock(&l);
}
#endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
@@ -112,7 +114,7 @@
{
char buf[80];
struct ahd_softc *ahd;
- ahd_dev_softc_t pci;
+ aic_dev_softc_t pci;
struct ahd_pci_identity *entry;
char *name;
int error;
@@ -144,9 +146,9 @@
* common detect routine.
*/
sprintf(buf, "ahd_pci:%d:%d:%d",
- ahd_get_pci_bus(pci),
- ahd_get_pci_slot(pci),
- ahd_get_pci_function(pci));
+ aic_get_pci_bus(pci),
+ aic_get_pci_slot(pci),
+ aic_get_pci_function(pci));
name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
if (name == NULL)
return (-ENOMEM);
@@ -170,16 +172,16 @@
mask_64bit = (bus_addr_t)0xFFFFFFFFFFFFFFFFULL;
mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
if (memsize >= 0x8000000000ULL
- && ahd_pci_set_dma_mask(pdev, mask_64bit) == 0) {
+ && aic_pci_set_dma_mask(pdev, mask_64bit) == 0) {
ahd->flags |= AHD_64BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = mask_64bit;
} else if (memsize > 0x80000000
- && ahd_pci_set_dma_mask(pdev, mask_39bit) == 0) {
+ && aic_pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahd->flags |= AHD_39BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = mask_39bit;
}
} else {
- ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+ aic_pci_set_dma_mask(pdev, 0xFFFFFFFF);
ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
}
#endif
@@ -222,7 +224,7 @@
pdev = NULL;
class = PCI_CLASS_STORAGE_SCSI << 8;
while ((pdev = pci_find_class(class, pdev)) != NULL) {
- ahd_dev_softc_t pci;
+ aic_dev_softc_t pci;
int error;
pci = pdev;
@@ -253,8 +255,8 @@
*/
*base2 = pci_resource_start(ahd->dev_softc, 3);
#else
- *base = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
- *base2 = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
+ *base = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
+ *base2 = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
*base &= PCI_BASE_ADDRESS_IO_MASK;
*base2 &= PCI_BASE_ADDRESS_IO_MASK;
#endif
@@ -299,7 +301,7 @@
base_page = start & PAGE_MASK;
base_offset = start - base_page;
#else
- start = ahd_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
+ start = aic_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
base_page = base_offset & PAGE_MASK;
base_offset -= base_page;
@@ -336,7 +338,7 @@
/*
* If its allowed, we prefer memory mapped access.
*/
- command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
+ command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
base = 0;
maddr = NULL;
@@ -347,16 +349,16 @@
ahd->bshs[0].maddr = maddr;
ahd->tags[1] = BUS_SPACE_MEMIO;
ahd->bshs[1].maddr = maddr + 0x100;
- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
command | PCIM_CMD_MEMEN, 4);
if (ahd_pci_test_register_access(ahd) != 0) {
printf("aic79xx: PCI Device %d:%d:%d "
"failed memory mapped test. Using PIO.\n",
- ahd_get_pci_bus(ahd->dev_softc),
- ahd_get_pci_slot(ahd->dev_softc),
- ahd_get_pci_function(ahd->dev_softc));
+ aic_get_pci_bus(ahd->dev_softc),
+ aic_get_pci_slot(ahd->dev_softc),
+ aic_get_pci_function(ahd->dev_softc));
iounmap((void *)((u_long)maddr & PAGE_MASK));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
release_mem_region(ahd->platform_data->mem_busaddr,
@@ -369,9 +371,9 @@
} else if (bootverbose) {
printf("aic79xx: PCI%d:%d:%d MEM region 0x%lx "
"unavailable. Cannot memory map device.\n",
- ahd_get_pci_bus(ahd->dev_softc),
- ahd_get_pci_slot(ahd->dev_softc),
- ahd_get_pci_function(ahd->dev_softc),
+ aic_get_pci_bus(ahd->dev_softc),
+ aic_get_pci_slot(ahd->dev_softc),
+ aic_get_pci_function(ahd->dev_softc),
base);
}
@@ -388,13 +390,13 @@
} else {
printf("aic79xx: PCI%d:%d:%d IO regions 0x%lx and 0x%lx"
"unavailable. Cannot map device.\n",
- ahd_get_pci_bus(ahd->dev_softc),
- ahd_get_pci_slot(ahd->dev_softc),
- ahd_get_pci_function(ahd->dev_softc),
+ aic_get_pci_bus(ahd->dev_softc),
+ aic_get_pci_slot(ahd->dev_softc),
+ aic_get_pci_function(ahd->dev_softc),
base, base2);
}
}
- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
return (error);
}
==== //depot/aic7xxx/aic7xxx/aic79xx_pci.c#81 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_pci.c ====
--- /tmp/tmp.26602.6 2004-09-27 13:12:57.475682192 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_pci.c 2003-10-31 17:54:03.000000000 -0500
@@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#81 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#83 $
*
* $FreeBSD$
*/
@@ -75,13 +75,13 @@
#define ID_AHA_29320ALP 0x8017900500449005ull
#define ID_AIC7901A 0x801E9005FFFF9005ull
-#define ID_AHA_29320 0x8012900500429005ull
-#define ID_AHA_29320B 0x8013900500439005ull
#define ID_AHA_29320LP 0x8014900500449005ull
#define ID_AIC7902 0x801F9005FFFF9005ull
#define ID_AIC7902_B 0x801D9005FFFF9005ull
#define ID_AHA_39320 0x8010900500409005ull
+#define ID_AHA_29320 0x8012900500429005ull
+#define ID_AHA_29320B 0x8013900500439005ull
#define ID_AHA_39320_B 0x8015900500409005ull
#define ID_AHA_39320A 0x8016900500409005ull
#define ID_AHA_39320D 0x8011900500419005ull
@@ -136,24 +136,24 @@
},
/* aic7901A based controllers */
{
- ID_AHA_29320,
+ ID_AHA_29320LP,
ID_ALL_MASK,
- "Adaptec 29320 Ultra320 SCSI adapter",
+ "Adaptec 29320LP Ultra320 SCSI adapter",
ahd_aic7901A_setup
},
+ /* aic7902 based controllers */
{
- ID_AHA_29320B,
+ ID_AHA_29320,
ID_ALL_MASK,
- "Adaptec 29320B Ultra320 SCSI adapter",
- ahd_aic7901A_setup
+ "Adaptec 29320 Ultra320 SCSI adapter",
+ ahd_aic7902_setup
},
{
- ID_AHA_29320LP,
+ ID_AHA_29320B,
ID_ALL_MASK,
- "Adaptec 29320LP Ultra320 SCSI adapter",
- ahd_aic7901A_setup
+ "Adaptec 29320B Ultra320 SCSI adapter",
+ ahd_aic7902_setup
},
- /* aic7902 based controllers */
{
ID_AHA_39320,
ID_ALL_MASK,
@@ -196,18 +196,6 @@
"Adaptec (HP OEM) 39320D Ultra320 SCSI adapter",
ahd_aic7902_setup
},
- {
- ID_AHA_29320,
- ID_ALL_MASK,
- "Adaptec 29320 Ultra320 SCSI adapter",
- ahd_aic7902_setup
- },
- {
- ID_AHA_29320B,
- ID_ALL_MASK,
- "Adaptec 29320B Ultra320 SCSI adapter",
- ahd_aic7902_setup
- },
/* Generic chip probes for devices we don't know 'exactly' */
{
ID_AIC7901 & ID_DEV_VENDOR_MASK,
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_reg.h#75 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped ====
--- /tmp/tmp.26602.7 2004-09-27 13:12:58.014600264 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped 2003-10-24 13:37:10.000000000 -0400
@@ -2,7 +2,7 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#104 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#105 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
*/
typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_reg_print.c#56 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped ====
--- /tmp/tmp.26602.8 2004-09-27 13:12:58.508525176 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped 2003-10-24 13:37:10.000000000 -0400
@@ -2,7 +2,7 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#104 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#105 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
*/
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_seq.h#76 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped ====
--- /tmp/tmp.26602.9 2004-09-27 13:12:58.663501616 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped 2003-10-24 13:37:10.000000000 -0400
@@ -2,7 +2,7 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#104 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#105 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
*/
static uint8_t seqprog[] = {
@@ -631,7 +631,7 @@
0x11, 0x00, 0x00, 0x10,
0x04, 0x19, 0x08, 0x7d,
0xdf, 0x19, 0x32, 0x08,
- 0x60, 0x5b, 0xe6, 0x6c,
+ 0x60, 0x5b, 0x08, 0x6d,
0x01, 0x4c, 0xe2, 0x7c,
0x20, 0x19, 0x32, 0x00,
0x01, 0xd9, 0xb2, 0x05,
==== //depot/aic7xxx/aic7xxx/aic7xxx.c#142 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_core.c ====
--- /tmp/tmp.26602.10 2004-09-27 13:13:00.070287752 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_core.c 2003-10-27 15:26:05.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#142 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#144 $
*
* $FreeBSD$
*/
@@ -3974,7 +3974,6 @@
default:
case 5:
ahc_shutdown(ahc);
- TAILQ_REMOVE(&ahc_tailq, ahc, links);
/* FALLTHROUGH */
case 4:
aic_dmamap_unload(ahc, ahc->shared_data_dmat,
@@ -4083,14 +4082,6 @@
* to disturb the integrity of the bus.
*/
ahc_pause(ahc);
- if ((ahc_inb(ahc, HCNTRL) & CHIPRST) != 0) {
- /*
- * The chip has not been initialized since
- * PCI/EISA/VLB bus reset. Don't trust
- * "left over BIOS data".
- */
- ahc->flags |= AHC_NO_BIOS_INIT;
- }
sxfrctl1_b = 0;
if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7770) {
u_int sblkctl;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#246 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c ====
--- /tmp/tmp.26602.11 2004-09-27 13:13:01.050138792 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-10-28 02:06:07.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Adaptec AIC7xxx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#246 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#251 $
*
* Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science.
@@ -1025,7 +1025,6 @@
struct ahc_softc *ahc;
u_long l;
- ahc_list_lock(&l);
if (host != NULL) {
/*
@@ -1033,17 +1032,20 @@
* the free directly, but check our
* list for extra sanity.
*/
+ ahc_list_lock(&l);
ahc = ahc_find_softc(*(struct ahc_softc **)host->hostdata);
if (ahc != NULL) {
u_long s;
+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
+ ahc_list_unlock(&l);
ahc_lock(ahc, &s);
ahc_intr_enable(ahc, FALSE);
ahc_unlock(ahc, &s);
ahc_free(ahc);
- }
+ } else
+ ahc_list_unlock(&l);
}
- ahc_list_unlock(&l);
return (0);
}
#endif
@@ -1512,19 +1514,19 @@
char primary_channel;
if (aic7xxx_reverse_scan != 0)
- value = ahc_get_pci_bus(lahc->dev_softc)
- - ahc_get_pci_bus(rahc->dev_softc);
+ value = aic_get_pci_bus(lahc->dev_softc)
+ - aic_get_pci_bus(rahc->dev_softc);
else
- value = ahc_get_pci_bus(rahc->dev_softc)
- - ahc_get_pci_bus(lahc->dev_softc);
+ value = aic_get_pci_bus(rahc->dev_softc)
+ - aic_get_pci_bus(lahc->dev_softc);
if (value != 0)
break;
if (aic7xxx_reverse_scan != 0)
- value = ahc_get_pci_slot(lahc->dev_softc)
- - ahc_get_pci_slot(rahc->dev_softc);
+ value = aic_get_pci_slot(lahc->dev_softc)
+ - aic_get_pci_slot(rahc->dev_softc);
else
- value = ahc_get_pci_slot(rahc->dev_softc)
- - ahc_get_pci_slot(lahc->dev_softc);
+ value = aic_get_pci_slot(rahc->dev_softc)
+ - aic_get_pci_slot(lahc->dev_softc);
if (value != 0)
break;
/*
@@ -1695,8 +1697,12 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
scsi_assign_lock(host, &ahc->platform_data->spin_lock);
#elif AHC_SCSI_HAS_HOST_LOCK != 0
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
+ host->host_lock = &ahc->platform_data->spin_lock;
+#else
host->lock = &ahc->platform_data->spin_lock;
#endif
+#endif
ahc->platform_data->host = host;
host->can_queue = AHC_MAX_QUEUE;
host->cmd_per_lun = 2;
@@ -1876,17 +1882,6 @@
ahc_update_neg_request(ahc, &devinfo, tstate,
tinfo, AHC_NEG_ALWAYS);
}
- /* Give the bus some time to recover */
- if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) {
- aic_freeze_simq(ahc);
- init_timer(&ahc->platform_data->reset_timer);
- ahc->platform_data->reset_timer.data = (u_long)ahc;
- ahc->platform_data->reset_timer.expires =
- jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
- ahc->platform_data->reset_timer.function =
- (aic_linux_callback_t *)aic_release_simq;
- add_timer(&ahc->platform_data->reset_timer);
- }
}
int
@@ -1904,6 +1899,10 @@
ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
ahc_lockinit(ahc);
ahc_done_lockinit(ahc);
+ init_timer(&ahc->platform_data->bus_settle_timer);
+ ahc->platform_data->bus_settle_timer.data = (u_long)ahc;
+ ahc->platform_data->bus_settle_timer.function =
+ (aic_linux_callback_t *)aic_bus_settle_complete;
init_timer(&ahc->platform_data->completeq_timer);
ahc->platform_data->completeq_timer.data = (u_long)ahc;
ahc->platform_data->completeq_timer.function =
@@ -2864,7 +2863,17 @@
}
#endif
if (echo_size == 0) {
- AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
+ /*
+ * Fall back to basic DV.
+ */
+ if (bootverbose) {
+ ahc_print_devinfo(ahc, devinfo);
+ printf("Echo Buffer unavailable. "
+ "Performing basic DV.\n");
+ }
+ targ->flags &= ~AIC_ENHANCED_DV;
+ targ->flags |= AIC_BASIC_DV;
+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_TUR);
break;
}
@@ -3441,19 +3450,9 @@
aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
ahc_reset_channel(ahc, cmd->device->channel + 'A', /*initiate*/TRUE);
- /*
- * Add a minimal bus settle delay for devices that are slow to
- * respond after bus resets.
- */
- aic_freeze_simq(ahc);
- init_timer(&ahc->platform_data->reset_timer);
- ahc->platform_data->reset_timer.data = (u_long)ahc;
- ahc->platform_data->reset_timer.expires = jiffies + HZ / 2;
- ahc->platform_data->reset_timer.function =
- (aic_linux_callback_t *)aic_release_simq;
- add_timer(&ahc->platform_data->reset_timer);
if (aic_linux_next_device_to_run(ahc) != NULL)
aic_schedule_runq(ahc);
+
ahc_linux_run_complete_queue(ahc);
ahc_unlock(ahc, &flags);
}
@@ -4094,6 +4093,20 @@
channel - 'A');
}
#endif
+ /*
+ * Add a minimal bus settle delay for devices that are slow to
+ * respond after bus resets.
+ */
+ if ((ahc->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
+ aic_freeze_simq(ahc);
+ ahc->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
+ ahc->platform_data->bus_settle_timer.expires =
+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
+ add_timer(&ahc->platform_data->bus_settle_timer);
+ } else {
+ mod_timer(&ahc->platform_data->bus_settle_timer,
+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000);
+ }
break;
default:
panic("ahc_send_async: Unexpected async event");
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#159 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h ====
--- /tmp/tmp.26602.12 2004-09-27 13:13:01.127127088 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h 2003-10-27 20:53:51.000000000 -0500
@@ -53,7 +53,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#159 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#162 $
*
*/
#ifndef _AIC7XXX_LINUX_H_
@@ -111,11 +111,6 @@
/* No debugging code. */
#endif
-/************************* Forward Declarations *******************************/
-struct ahc_softc;
-typedef struct pci_dev *ahc_dev_softc_t;
-typedef Scsi_Cmnd *ahc_io_ctx_t;
-
/************************* Configuration Data *********************************/
extern u_int aic7xxx_no_probe;
extern u_int aic7xxx_allow_memio;
@@ -148,7 +143,7 @@
#define AHC_SCSI_HAS_HOST_LOCK 0
#endif
-#define AIC7XXX_DRIVER_VERSION "6.3.0"
+#define AIC7XXX_DRIVER_VERSION "6.3.2"
/********************* Definitions Required by the Core ***********************/
/*
@@ -184,29 +179,6 @@
void ahc_set_recoveryscb(struct ahc_softc *ahc,
struct scb *scb);
-/************************** OS Utility Wrappers *******************************/
-#define printf printk
-#define M_NOWAIT GFP_ATOMIC
-#define M_WAITOK 0
-#define malloc(size, type, flags) kmalloc(size, flags)
-#define free(ptr, type) kfree(ptr)
-
-static __inline void ahc_delay(long);
-static __inline void
-ahc_delay(long usec)
-{
- /*
- * udelay on Linux can have problems for
- * multi-millisecond waits. Wait at most
- * 1024us per call.
- */
- while (usec > 0) {
- udelay(usec % 1024);
- usec -= 1024;
- }
-}
-
-
/***************************** Low Level I/O **********************************/
static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port);
static __inline void ahc_outb(struct ahc_softc * ahc, long port, uint8_t val);
@@ -214,6 +186,7 @@
uint8_t *, int count);
static __inline void ahc_insb(struct ahc_softc * ahc, long port,
uint8_t *, int count);
+static __inline void ahc_flush_device_writes(struct ahc_softc *);
static __inline uint8_t
ahc_inb(struct ahc_softc * ahc, long port)
@@ -268,6 +241,13 @@
*array++ = ahc_inb(ahc, port);
}
+static __inline void
+ahc_flush_device_writes(struct ahc_softc *ahc)
+{
+ /* XXX Is this sufficient for all architectures??? */
+ ahc_inb(ahc, INTSTAT);
+}
+
/**************************** Initialization **********************************/
int ahc_linux_register_host(struct ahc_softc *,
Scsi_Host_Template *);
@@ -422,112 +402,8 @@
void ahc_linux_pci_exit(void);
int ahc_pci_map_registers(struct ahc_softc *ahc);
int ahc_pci_map_int(struct ahc_softc *ahc);
+#endif
-static __inline uint32_t ahc_pci_read_config(ahc_dev_softc_t pci,
- int reg, int width);
-
-static __inline uint32_t
-ahc_pci_read_config(ahc_dev_softc_t pci, int reg, int width)
-{
- switch (width) {
- case 1:
- {
- uint8_t retval;
-
- pci_read_config_byte(pci, reg, &retval);
- return (retval);
- }
- case 2:
- {
- uint16_t retval;
- pci_read_config_word(pci, reg, &retval);
- return (retval);
- }
- case 4:
- {
- uint32_t retval;
- pci_read_config_dword(pci, reg, &retval);
- return (retval);
- }
- default:
- panic("ahc_pci_read_config: Read size too big");
- /* NOTREACHED */
- return (0);
- }
-}
-
-static __inline void ahc_pci_write_config(ahc_dev_softc_t pci,
- int reg, uint32_t value,
- int width);
-
-static __inline void
-ahc_pci_write_config(ahc_dev_softc_t pci, int reg, uint32_t value, int width)
-{
- switch (width) {
- case 1:
- pci_write_config_byte(pci, reg, value);
- break;
- case 2:
- pci_write_config_word(pci, reg, value);
- break;
- case 4:
- pci_write_config_dword(pci, reg, value);
- break;
- default:
- panic("ahc_pci_write_config: Write size too big");
- /* NOTREACHED */
- }
-}
-
-static __inline int ahc_get_pci_function(ahc_dev_softc_t);
-static __inline int
-ahc_get_pci_function(ahc_dev_softc_t pci)
-{
- return (PCI_FUNC(pci->devfn));
-}
-
-static __inline int ahc_get_pci_slot(ahc_dev_softc_t);
-static __inline int
-ahc_get_pci_slot(ahc_dev_softc_t pci)
-{
- return (PCI_SLOT(pci->devfn));
-}
-
-static __inline int ahc_get_pci_bus(ahc_dev_softc_t);
-static __inline int
-ahc_get_pci_bus(ahc_dev_softc_t pci)
-{
- return (pci->bus->number);
-}
-#endif
-
-static __inline void ahc_flush_device_writes(struct ahc_softc *);
-static __inline void
-ahc_flush_device_writes(struct ahc_softc *ahc)
-{
- /* XXX Is this sufficient for all architectures??? */
- ahc_inb(ahc, INTSTAT);
-}
-
-#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 ahc_pci_set_dma_mask pci_set_dma_mask
-#else
-/*
- * Always "return" 0 for success.
- */
-#define ahc_pci_set_dma_mask(dev_softc, mask) \
- (((dev_softc)->dma_mask = mask) && 0)
-#endif
/**************************** Proc FS Support *********************************/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
int ahc_linux_proc_info(char *, char **, off_t, int, int, int);
@@ -562,9 +438,9 @@
void ahc_platform_dump_card_state(struct ahc_softc *ahc);
#ifdef CONFIG_PCI
-#define AHC_PCI_CONFIG 1
+#define AIC_PCI_CONFIG 1
#else
-#define AHC_PCI_CONFIG 0
+#define AIC_PCI_CONFIG 0
#endif
#define bootverbose aic7xxx_verbose
extern u_int aic7xxx_verbose;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#48 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c ====
--- /tmp/tmp.26602.13 2004-09-27 13:13:01.185118272 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2003-10-27 15:45:13.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#48 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#51 $
*/
#include "aic7xxx_osm.h"
@@ -101,12 +101,14 @@
if (ahc != NULL) {
u_long s;
+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
+ ahc_list_unlock(&l);
ahc_lock(ahc, &s);
ahc_intr_enable(ahc, FALSE);
ahc_unlock(ahc, &s);
ahc_free(ahc);
- }
- ahc_list_unlock(&l);
+ } else
+ ahc_list_unlock(&l);
}
#endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
@@ -116,7 +118,7 @@
char buf[80];
bus_addr_t mask_39bit;
struct ahc_softc *ahc;
- ahc_dev_softc_t pci;
+ aic_dev_softc_t pci;
struct ahc_pci_identity *entry;
char *name;
int error;
@@ -148,9 +150,9 @@
* common detect routine.
*/
sprintf(buf, "ahc_pci:%d:%d:%d",
- ahc_get_pci_bus(pci),
- ahc_get_pci_slot(pci),
- ahc_get_pci_function(pci));
+ aic_get_pci_bus(pci),
+ aic_get_pci_slot(pci),
+ aic_get_pci_function(pci));
name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
if (name == NULL)
return (-ENOMEM);
@@ -168,11 +170,11 @@
mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
if (sizeof(bus_addr_t) > 4
&& ahc_linux_get_memsize() > 0x80000000
- && ahc_pci_set_dma_mask(pdev, mask_39bit) == 0) {
+ && aic_pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahc->flags |= AHC_39BIT_ADDRESSING;
ahc->platform_data->hw_dma_mask = mask_39bit;
} else {
- ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+ aic_pci_set_dma_mask(pdev, 0xFFFFFFFF);
ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
}
#endif
@@ -215,7 +217,7 @@
pdev = NULL;
class = PCI_CLASS_STORAGE_SCSI << 8;
while ((pdev = pci_find_class(class, pdev)) != NULL) {
- ahc_dev_softc_t pci;
+ aic_dev_softc_t pci;
int error;
pci = pdev;
@@ -242,7 +244,7 @@
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
*base = pci_resource_start(ahc->dev_softc, 0);
#else
- *base = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
+ *base = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
*base &= PCI_BASE_ADDRESS_IO_MASK;
#endif
if (*base == 0)
@@ -274,7 +276,7 @@
base_page = start & PAGE_MASK;
base_offset = start - base_page;
#else
- start = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
+ start = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
base_page = base_offset & PAGE_MASK;
base_offset -= base_page;
@@ -311,7 +313,7 @@
/*
* If its allowed, we prefer memory mapped access.
*/
- command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
+ command = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
base = 0;
maddr = NULL;
@@ -320,7 +322,7 @@
ahc->platform_data->mem_busaddr = base;
ahc->tag = BUS_SPACE_MEMIO;
ahc->bsh.maddr = maddr;
- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
command | PCIM_CMD_MEMEN, 4);
/*
@@ -331,9 +333,9 @@
printf("aic7xxx: PCI Device %d:%d:%d "
"failed memory mapped test. Using PIO.\n",
- ahc_get_pci_bus(ahc->dev_softc),
- ahc_get_pci_slot(ahc->dev_softc),
- ahc_get_pci_function(ahc->dev_softc));
+ aic_get_pci_bus(ahc->dev_softc),
+ aic_get_pci_slot(ahc->dev_softc),
+ aic_get_pci_function(ahc->dev_softc));
iounmap((void *)((u_long)maddr & PAGE_MASK));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
release_mem_region(ahc->platform_data->mem_busaddr,
@@ -346,9 +348,9 @@
} else {
printf("aic7xxx: PCI%d:%d:%d MEM region 0x%lx "
"unavailable. Cannot memory map device.\n",
- ahc_get_pci_bus(ahc->dev_softc),
- ahc_get_pci_slot(ahc->dev_softc),
- ahc_get_pci_function(ahc->dev_softc),
+ aic_get_pci_bus(ahc->dev_softc),
+ aic_get_pci_slot(ahc->dev_softc),
+ aic_get_pci_function(ahc->dev_softc),
base);
}
@@ -358,20 +360,20 @@
if (maddr == NULL) {
error = ahc_linux_pci_reserve_io_region(ahc, &base);
- if (error == 0) {
+ if (error == 0 && ahc_pci_test_register_access(ahc) == 0) {
ahc->tag = BUS_SPACE_PIO;
ahc->bsh.ioport = base;
command |= PCIM_CMD_PORTEN;
} else {
printf("aic7xxx: PCI%d:%d:%d IO region 0x%lx[0..255] "
"unavailable. Cannot map device.\n",
- ahc_get_pci_bus(ahc->dev_softc),
- ahc_get_pci_slot(ahc->dev_softc),
- ahc_get_pci_function(ahc->dev_softc),
+ aic_get_pci_bus(ahc->dev_softc),
+ aic_get_pci_slot(ahc->dev_softc),
+ aic_get_pci_function(ahc->dev_softc),
base);
}
}
- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
return (error);
}
==== //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#73 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_pci.c ====
--- /tmp/tmp.26602.14 2004-09-27 13:13:01.720036952 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_pci.c 2003-10-27 20:25:22.000000000 -0500
@@ -39,7 +39,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_pci.c#73 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#75 $
*
* $FreeBSD$
*/
@@ -1276,9 +1276,19 @@
* use for this test.
*/
hcntrl = ahc_inb(ahc, HCNTRL);
+
if (hcntrl == 0xFF)
goto fail;
+ if ((hcntrl & CHIPRST) != 0) {
+ /*
+ * The chip has not been initialized since
+ * PCI/EISA/VLB bus reset. Don't trust
+ * "left over BIOS data".
+ */
+ ahc->flags |= AHC_NO_BIOS_INIT;
+ }
+
/*
* Next create a situation where write combining
* or read prefetching could be initiated by the
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#31 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_proc.c ====
--- /tmp/tmp.26602.15 2004-09-27 13:13:01.823021296 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_proc.c 2003-10-20 18:42:30.000000000 -0400
@@ -37,7 +37,7 @@
* String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
* sym driver.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#31 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#32 $
*/
#include "aic7xxx_osm.h"
#include "aic7xxx_inline.h"
@@ -216,7 +216,7 @@
}
sd.sd_ahc = ahc;
-#if AHC_PCI_CONFIG > 0
+#if AIC_PCI_CONFIG > 0
if ((ahc->chip & AHC_PCI) != 0) {
sd.sd_control_offset = SEECTL;
sd.sd_status_offset = SEECTL;
@@ -272,7 +272,7 @@
sizeof(struct seeprom_config)/2);
ahc_read_seeprom(&sd, (uint16_t *)ahc->seep_config,
start_addr, sizeof(struct seeprom_config)/2);
-#if AHC_PCI_CONFIG > 0
+#if AIC_PCI_CONFIG > 0
if ((ahc->chip & AHC_VL) == 0)
ahc_release_seeprom(&sd);
#endif
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.c#13 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c ====
--- /tmp/tmp.26602.16 2004-09-27 13:13:02.096979648 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c 2003-10-27 14:44:01.000000000 -0500
@@ -1643,6 +1643,27 @@
}
void
+aic_bus_settle_complete(u_long data)
+{
+ struct aic_softc *aic;
+ u_long s;
+
+ aic = (struct aic_softc *)data;
+ /*
+ * Guard against our bottom half scheduling another
+ * bus settle delay just as our timer runs. If this
+ * occurs, do nothing. The newly scheduled timer will
+ * take care of things.
+ */
+ aic_lock(aic, &s);
+ if (timer_pending(&aic->platform_data->bus_settle_timer) == 0) {
+ aic->platform_data->flags &= ~AIC_BUS_SETTLE_TIMER;
+ aic_release_simq_locked(aic);
+ }
+ aic_unlock(aic, &s);
+}
+
+void
aic_freeze_simq(struct aic_softc *aic)
{
aic->platform_data->qfrozen++;
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.h#17 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h ====
--- /tmp/tmp.26602.17 2004-09-27 13:13:02.515915960 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h 2003-10-27 14:49:44.000000000 -0500
@@ -111,12 +111,13 @@
#define aic_lock AIC_LIB_ENTRY(_lock)
#define aic_unlock AIC_LIB_ENTRY(_unlock)
#define aic_dump_card_state AIC_LIB_ENTRY(_dump_card_state)
-#define aic_pci_set_dma_mask AIC_LIB_ENTRY(_pci_set_dma_mask)
#define aic_linux_dv_complete AIC_LIB_ENTRY(_linux_dv_complete)
#define aic_linux_run_device_queue AIC_LIB_ENTRY(_linux_run_device_queue)
#define aic_linux_dv_timeout AIC_LIB_ENTRY(_linux_dv_timeout)
#define aic_linux_midlayer_timeout AIC_LIB_ENTRY(_linux_midlayer_timeout)
#define aic_freeze_simq AIC_LIB_ENTRY(_freeze_simq)
+#define aic_bus_settle_complete AIC_LIB_ENTRY(_bus_settle_complete)
+#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
#define aic_release_simq_locked AIC_LIB_ENTRY(_release_simq_locked)
#define aic_dma_tag_create AIC_LIB_ENTRY(_dma_tag_create)
@@ -150,6 +151,11 @@
#define AIC_NUM_TARGETS AIC_CONST_ENTRY(_NUM_TARGETS)
#define AIC_RESOURCE_SHORTAGE AIC_CONST_ENTRY(_RESOURCE_SHORTAGE)
+/*************************** Forward Declarations *****************************/
+struct aic_softc;
+typedef struct pci_dev *aic_dev_softc_t;
+typedef Scsi_Cmnd *aic_io_ctx_t;
+
/*************************** Timer DataStructures *****************************/
typedef struct timer_list aic_timer_t;
@@ -252,6 +258,28 @@
*/
#define aic_dmamap_sync(aic, dma_tag, dmamap, offset, len, op)
+/************************** OS Utility Wrappers *******************************/
+#define printf printk
+#define M_NOWAIT GFP_ATOMIC
+#define M_WAITOK 0
+#define malloc(size, type, flags) kmalloc(size, flags)
+#define free(ptr, type) kfree(ptr)
+
+static __inline void aic_delay(long);
+static __inline void
+aic_delay(long usec)
+{
+ /*
+ * udelay on Linux can have problems for
+ * multi-millisecond waits. Wait at most
+ * 1024us per call.
+ */
+ while (usec > 0) {
+ udelay(usec % 1024);
+ usec -= 1024;
+ }
+}
+
/********************************** Misc Macros *******************************/
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#define powerof2(x) ((((x)-1)&(x))==0)
@@ -509,7 +537,8 @@
AIC_DV_WAIT_SIMQ_RELEASE = 0x02,
AIC_DV_ACTIVE = 0x04,
AIC_DV_SHUTDOWN = 0x08,
- AIC_RUN_CMPLT_Q_TIMER = 0x10
+ AIC_RUN_CMPLT_Q_TIMER = 0x10,
+ AIC_BUS_SETTLE_TIMER = 0x20
} aic_linux_softc_flags;
TAILQ_HEAD(aic_completeq, aic_cmd);
@@ -531,7 +560,7 @@
pid_t dv_pid;
pid_t recovery_pid;
struct timer_list completeq_timer;
- struct timer_list reset_timer;
+ struct timer_list bus_settle_timer;
struct timer_list stats_timer;
struct semaphore eh_sem;
struct semaphore dv_sem;
@@ -1657,6 +1686,102 @@
#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,
+ int reg, int width);
+static __inline void aic_pci_write_config(aic_dev_softc_t pci,
+ int reg, uint32_t value,
+ int width);
+static __inline int aic_get_pci_function(aic_dev_softc_t);
+static __inline int aic_get_pci_slot(aic_dev_softc_t);
+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)
+{
+ switch (width) {
+ case 1:
+ {
+ uint8_t retval;
+
+ pci_read_config_byte(pci, reg, &retval);
+ return (retval);
+ }
+ case 2:
+ {
+ uint16_t retval;
+ pci_read_config_word(pci, reg, &retval);
+ return (retval);
+ }
+ case 4:
+ {
+ uint32_t retval;
+ pci_read_config_dword(pci, reg, &retval);
+ return (retval);
+ }
+ default:
+ panic("aic_pci_read_config: Read size too big");
+ /* NOTREACHED */
+ return (0);
+ }
+}
+
+static __inline void
+aic_pci_write_config(aic_dev_softc_t pci, int reg, uint32_t value, int width)
+{
+ switch (width) {
+ case 1:
+ pci_write_config_byte(pci, reg, value);
+ break;
+ case 2:
+ pci_write_config_word(pci, reg, value);
+ break;
+ case 4:
+ pci_write_config_dword(pci, reg, value);
+ break;
+ default:
+ panic("aic_pci_write_config: Write size too big");
+ /* NOTREACHED */
+ }
+}
+
+static __inline int
+aic_get_pci_function(aic_dev_softc_t pci)
+{
+ return (PCI_FUNC(pci->devfn));
+}
+
+static __inline int
+aic_get_pci_slot(aic_dev_softc_t pci)
+{
+ return (PCI_SLOT(pci->devfn));
+}
+
+static __inline int
+aic_get_pci_bus(aic_dev_softc_t pci)
+{
+ 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);
@@ -1828,9 +1953,6 @@
return (rv);
}
-/*************************** Forward Declarations *****************************/
-struct aic_softc;
-
/******************************* PCI Funcitons ********************************/
void aic_power_state_change(struct aic_softc *aic, aic_power_state new_state);
@@ -1839,6 +1961,7 @@
void aic_unblock_tasklet(unsigned long data);
void aic_linux_run_device_queue(struct aic_softc*,
struct aic_linux_device*);
+void aic_bus_settle_complete(u_long data);
void aic_freeze_simq(struct aic_softc *aic);
void aic_release_simq(struct aic_softc *aic);
void aic_release_simq_locked(struct aic_softc *aic);
^ 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 13/28] Sync up drivers/scsi/aic7xxx Luben Tuikov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.