* Re: Aic7xxx and Aic79xx driver updates.
[not found] ` <175810000.1041300864@aslan.btc.adaptec.com>
@ 2003-01-08 3:46 ` Justin T. Gibbs
2003-01-08 3:49 ` Justin T. Gibbs
0 siblings, 1 reply; 12+ messages in thread
From: Justin T. Gibbs @ 2003-01-08 3:46 UTC (permalink / raw)
To: Linus Torvalds; +Cc: linux-scsi
[-- Attachment #1: Type: text/plain, Size: 407 bytes --]
I've uploaded a new "bk send" file relative to the 2.5.X repository.
I've also attached the output from "Documentation/.../bksend". The
"bk send" version can be found here:
http://people.FreeBSD.org/~gibbs/linux/SRC/aic79xx-linux-2.5-bksend.gz
This should correct the false positives some have seen with the
mmapped I/O test on some of the older controllers that the aic7xxx
driver supports.
--
Justin
[-- Attachment #2: bksend.out --]
[-- Type: application/octet-stream, Size: 39794 bytes --]
You can import this changeset into BK by piping this whole message to:
'| bk receive [path to repository]' or apply the patch as usual.
===================================================================
ChangeSet@1.893.1.4, 2003-01-07 19:58:41-07:00, gibbs@overdrive.btc.adaptec.com
aic7xxx and aic79xx driver updates:
o Correct memory mapped I/O test for legacy controllers
that do not have the "auto-access-pause" feature.
o Prevent NMIs from triggering should the MMAP I/O test fail.
o Fix aic7770 (EISA/VLB) controller regression.
o Kill a few compiler warnings.
ChangeSet@1.893.1.3, 2003-01-07 19:40:37-07:00, gibbs@overdrive.btc.adaptec.com
aic7xxx and aic79xx drivers Correct several DV issues:
o Do not fallback to a wide speed if the device does not support
wide transfers.
o Don't bother allocating target instances for wide IDs on narrow
controllers.
o Add a few additional diagnostics to aid in tracking down DV bugs.
ChangeSet@1.893.1.2, 2003-01-07 19:32:07-07:00, gibbs@overdrive.btc.adaptec.com
aic7xxx/aicasm:
Remove the numerical_value portion of the grammer which is no
longer referenced. This eliminates a yacc warning.
ChangeSet@1.897, 2003-01-07 18:31:40-08:00, anton@samba.org
[PATCH] small module patch
Add a missing inline, shows up when modules are turned off.
ChangeSet@1.893.1.1, 2003-01-07 19:29:46-07:00, gibbs@overdrive.btc.adaptec.com
Update the aic7xxx Makefile so that the register information tables
are not rebuilt on every build.
Use better Kbuild rule style for building firmware.
Submitted by: Sam Ravnborg <sam@ravnborg.org>
ChangeSet@1.896, 2003-01-07 16:41:22-08:00, greg@kroah.com
PCI hotplug: clean up the try_module_get() logic a bit.
ChangeSet@1.895, 2003-01-07 16:29:23-08:00, greg@kroah.com
PCI: properly unregister a PCI device if it is removed.
This is only used by pci hotplug and cardbus systems.
ChangeSet@1.894, 2003-01-07 16:24:14-08:00, greg@kroah.com
IBM PCI Hotplug: fix compile time error due to find_bus() function name.
Makefile | 49 ++++++++++++++---------------
aic79xx_core.c | 16 +++++----
aic79xx_osm.c | 25 +++++++++++++-
aic79xx_osm.h | 13 ++++---
aic79xx_osm_pci.c | 5 ++
aic79xx_pci.c | 25 ++++++++++----
aic7xxx.h | 3 -
aic7xxx.reg | 4 +-
aic7xxx.seq | 4 +-
aic7xxx_core.c | 74 ++++++++------------------------------------
aic7xxx_osm.c | 29 ++++++++++++++---
aic7xxx_osm.h | 15 ++++----
aic7xxx_osm_pci.c | 6 +--
aic7xxx_pci.c | 34 +++++++++++++-------
aic7xxx_reg.h_shipped | 5 +-
aic7xxx_reg_print.c_shipped | 4 +-
aic7xxx_seq.h_shipped | 4 +-
aicasm/aicasm_gram.y | 15 +-------
18 files changed, 173 insertions(+), 157 deletions(-)
diff -Nru a/drivers/scsi/aic7xxx/Makefile b/drivers/scsi/aic7xxx/Makefile
--- a/drivers/scsi/aic7xxx/Makefile Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/Makefile Tue Jan 7 20:41:22 2003
@@ -1,7 +1,7 @@
#
# Makefile for the Linux aic7xxx SCSI driver.
#
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#3 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#5 $
#
# Let kbuild descend into aicasm when cleaning
@@ -44,40 +44,39 @@
$(obj)/aic7xxx_core.o: $(obj)/aic7xxx_seq.h
$(obj)/aic79xx_core.o: $(obj)/aic79xx_seq.h
+$(obj)/aic79xx_reg_print.c: $(src)/aic79xx_reg_print.c_shipped
+$(obj)/aic7xxx_reg_print.c: $(src)/aic7xxx_reg_print.c_shipped
$(addprefix $(obj)/,$(aic7xxx-y)): $(obj)/aic7xxx_reg.h
$(addprefix $(obj)/,$(aic79xx-y)): $(obj)/aic79xx_reg.h
+aic7xxx-gen-$(CONFIG_AIC7XXX_BUILD_FIRMWARE) := $(obj)/aic7xxx_seq.h \
+ $(obj)/aic7xxx_reg.h
+aic7xxx-gen-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT) += $(obj)/aic7xxx_reg_print.c
+
+aicasm-7xxx-opts-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT) := \
+ -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h
+
ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
-aic7xxx_gen = $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_reg.h
-ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
-aic7xxx_gen += $(obj)/aic7xxx_reg_print.c
-aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
- -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h \
- -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq
-else
-aic7xxx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
- -o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq
+$(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 \
+ $(src)/aic7xxx.seq
endif
-$(aic7xxx_gen): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm
- $(aic7xxx_asm_cmd)
-endif
+aic79xx-gen-$(CONFIG_AIC79XX_BUILD_FIRMWARE) := $(obj)/aic79xx_seq.h \
+ $(obj)/aic79xx_reg.h
+aic79xx-gen-$(CONFIG_AIC79XX_REG_PRETTY_PRINT) += $(obj)/aic79xx_reg_print.c
+
+aicasm-79xx-opts-$(CONFIG_AIC79XX_REG_PRETTY_PRINT) := \
+ -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h
ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
-aic79xx_gen = $(obj)/aic79xx_seq.h $(obj)/aic79xx_reg.h
-ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
-aic79xx_gen += $(obj)/aic79xx_reg_print.c
-aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
- -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h \
- -o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq
-else
-aic79xx_asm_cmd = $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
- -o $(obj)/aic79xx_seq.h $(src)/aic79xx.seq
+$(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 \
+ $(src)/aic79xx.seq
endif
-$(aic79xx_gen): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm
- $(aic79xx_asm_cmd)
-endif
$(obj)/aicasm/aicasm: $(src)/aicasm/*.[chyl]
$(MAKE) -C $(src)/aicasm
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c
--- a/drivers/scsi/aic7xxx/aic79xx_core.c Tue Jan 7 20:41:21 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_core.c Tue Jan 7 20:41:21 2003
@@ -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#148 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#150 $
*
* $FreeBSD$
*/
@@ -2321,13 +2321,13 @@
/* Skip all PACED only entries if IU is not available */
if ((*ppr_options & MSG_EXT_PPR_IU_REQ) == 0
- && maxsync < AHD_SYNCRATE_DT)
- maxsync = AHD_SYNCRATE_DT;
+ && *period < AHD_SYNCRATE_DT)
+ *period = AHD_SYNCRATE_DT;
/* Skip all DT only entries if DT is not available */
if ((*ppr_options & MSG_EXT_PPR_DT_REQ) == 0
- && maxsync < AHD_SYNCRATE_ULTRA2)
- maxsync = AHD_SYNCRATE_ULTRA2;
+ && *period < AHD_SYNCRATE_ULTRA2)
+ *period = AHD_SYNCRATE_ULTRA2;
}
/*
@@ -5680,7 +5680,8 @@
/*lowaddr*/BUS_SPACE_MAXADDR,
/*highaddr*/BUS_SPACE_MAXADDR,
/*filter*/NULL, /*filterarg*/NULL,
- /*maxsize*/MAXBSIZE, /*nsegments*/AHD_NSEG,
+ /*maxsize*/(AHD_NSEG - 1) * PAGE_SIZE,
+ /*nsegments*/AHD_NSEG,
/*maxsegsz*/AHD_MAXTRANSFER_SIZE,
/*flags*/BUS_DMA_ALLOCNOW,
&ahd->buffer_dmat) != 0) {
@@ -7856,7 +7857,8 @@
#ifdef AHD_DEBUG
if ((ahd_debug & AHD_SHOW_MISC) != 0) {
ahd_print_path(ahd, scb);
- printf("Handled Residual of %d bytes\n", resid);
+ printf("Handled %sResidual of %d bytes\n",
+ (scb->flags & SCB_SENSE) ? "Sense " : "", resid);
}
#endif
}
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c Tue Jan 7 20:41:21 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c Tue Jan 7 20:41:21 2003
@@ -1,7 +1,7 @@
/*
* Adaptec AIC79xx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#103 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#104 $
*
* --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -2058,7 +2058,7 @@
* negotiation will occur for the first command, and DV
* will comence should that first command be successful.
*/
- for (target = 0; target < AHD_NUM_TARGETS; target++)
+ for (target = 0; target < host->max_id; target++)
ahd_linux_alloc_target(ahd, 0, target);
ahd_intr_enable(ahd, TRUE);
ahd_linux_start_dv(ahd);
@@ -2883,6 +2883,23 @@
break;
}
+#ifdef AHD_DEBUG
+ if (ahd_debug & AHD_SHOW_DV) {
+ int i;
+
+ ahd_print_devinfo(ahd, devinfo);
+ printf("Inquiry buffer mismatch:");
+ for (i = 0; i < AHD_LINUX_DV_INQ_LEN; i++) {
+ if ((i & 0xF) == 0)
+ printf("\n ");
+ printf("0x%x:0x0%x ",
+ ((uint8_t *)targ->inq_data)[i],
+ targ->dv_buffer[i]);
+ }
+ printf("\n");
+ }
+#endif
+
if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
break;
@@ -3525,6 +3542,8 @@
targ->dv_next_narrow_period = MAX(period, AHD_SYNCRATE_ULTRA2);
if (targ->dv_next_wide_period == 0)
targ->dv_next_wide_period = period;
+ if (targ->dv_max_width == 0)
+ targ->dv_max_width = width;
if (targ->dv_max_ppr_options == 0)
targ->dv_max_ppr_options = ppr_options;
if (targ->dv_last_ppr_options == 0)
@@ -3619,7 +3638,7 @@
period++;
}
} else if ((ahd->features & AHD_WIDE) != 0
- && tinfo->user.width != 0
+ && targ->dv_max_width != 0
&& wide_speed >= fallback_speed
&& (targ->dv_next_wide_period <= AHD_ASYNC_XFER_PERIOD
|| period >= AHD_ASYNC_XFER_PERIOD)) {
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h Tue Jan 7 20:41:22 2003
@@ -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#99 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#102 $
*
*/
#ifndef _AIC79XX_LINUX_H_
@@ -288,7 +288,7 @@
#include <linux/smp.h>
#endif
-#define AIC79XX_DRIVER_VERSION "1.3.0.ALPHA6"
+#define AIC79XX_DRIVER_VERSION "1.3.0.BETA2"
/**************************** Front End Queues ********************************/
/*
@@ -458,10 +458,11 @@
/*
* The next "fallback" period to use for narrow/wide transfers.
*/
- u_int dv_next_narrow_period;
- u_int dv_next_wide_period;
- u_int dv_max_ppr_options;
- u_int dv_last_ppr_options;
+ uint8_t dv_next_narrow_period;
+ uint8_t dv_next_wide_period;
+ uint8_t dv_max_width;
+ uint8_t dv_max_ppr_options;
+ uint8_t dv_last_ppr_options;
u_int dv_echo_size;
ahd_dv_state dv_state;
u_int dv_state_retry;
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
--- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c Tue Jan 7 20:41:22 2003
@@ -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#19 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#20 $
*/
#include "aic79xx_osm.h"
@@ -170,6 +170,9 @@
ahd->platform_data->hw_dma_mask =
(bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
}
+ } else {
+ ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+ ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
}
#endif
ahd->dev_softc = pci;
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c
--- a/drivers/scsi/aic7xxx/aic79xx_pci.c Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_pci.c Tue Jan 7 20:41:22 2003
@@ -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#60 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#61 $
*
* $FreeBSD$
*/
@@ -379,15 +379,20 @@
ahd_pci_test_register_access(struct ahd_softc *ahd)
{
ahd_mode_state saved_modes;
+ uint32_t cmd;
int error;
- uint8_t seqctl;
+ uint8_t hcntrl;
saved_modes = ahd_save_modes(ahd);
error = EIO;
- /* Enable PCI error interrupt status */
- seqctl = ahd_inb(ahd, SEQCTL0);
- ahd_outb(ahd, SEQCTL0, seqctl & ~FAILDIS);
+ /*
+ * Enable PCI error interrupt status, but suppress NMIs
+ * generated by SERR raised due to target aborts.
+ */
+ cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
+ ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
+ cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
/*
* First a simple test to see if any
@@ -397,7 +402,8 @@
* be zero so it is a good register to
* use for this test.
*/
- if (ahd_inb(ahd, HCNTRL) == 0xFF)
+ hcntrl = ahd_inb(ahd, HCNTRL);
+ if (hcntrl == 0xFF)
goto fail;
/*
@@ -407,6 +413,10 @@
* either, so look for data corruption and/or flaged
* PCI errors.
*/
+ ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
+ while (ahd_is_paused(ahd) == 0)
+ ;
+ ahd_outb(ahd, SEQCTL0, PERRORDIS);
ahd_outl(ahd, SRAM_BASE, 0x5aa555aa);
if (ahd_inl(ahd, SRAM_BASE) != 0x5aa555aa)
goto fail;
@@ -440,7 +450,8 @@
}
ahd_restore_modes(ahd, saved_modes);
- ahd_outb(ahd, SEQCTL0, seqctl);
+ ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS);
+ ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
return (error);
}
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h
--- a/drivers/scsi/aic7xxx/aic7xxx.h Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx.h Tue Jan 7 20:41:22 2003
@@ -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.h#66 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#67 $
*
* $FreeBSD$
*/
@@ -1053,7 +1053,6 @@
u_int pci_cachesize;
u_int stack_size;
- uint16_t *saved_stack;
/* Per-Unit descriptive information */
const char *description;
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.reg b/drivers/scsi/aic7xxx/aic7xxx.reg
--- a/drivers/scsi/aic7xxx/aic7xxx.reg Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx.reg Tue Jan 7 20:41:22 2003
@@ -39,7 +39,7 @@
*
* $FreeBSD$
*/
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#36 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $"
/*
* This file is processed by the aic7xxx_asm utility for use in assembling
@@ -672,6 +672,8 @@
address 0x06f
access_mode RO
}
+
+const STACK_SIZE 4
/*
* Board Control (p. 3-43)
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.seq b/drivers/scsi/aic7xxx/aic7xxx.seq
--- a/drivers/scsi/aic7xxx/aic7xxx.seq Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx.seq Tue Jan 7 20:41:22 2003
@@ -40,7 +40,7 @@
* $FreeBSD$
*/
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#52 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#53 $"
PATCH_ARG_LIST = "struct ahc_softc *ahc"
PREFIX = "ahc_"
@@ -70,7 +70,7 @@
* Turn off the selection hardware. We need to reset the
* selection request in order to perform a new selection.
*/
- and SCSISEQ, TEMODE|ENSELI|ENRSELI|ENAUTOATNP, SCSISEQ;
+ and SCSISEQ, TEMODE|ENSELI|ENRSELI|ENAUTOATNP;
and SIMODE1, ~ENBUSFREE;
poll_for_work:
call clear_target_state;
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c
--- a/drivers/scsi/aic7xxx/aic7xxx_core.c Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_core.c Tue Jan 7 20:41:22 2003
@@ -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#105 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#108 $
*
* $FreeBSD$
*/
@@ -230,7 +230,6 @@
u_int start_instr, u_int *skip_addr);
static void ahc_download_instr(struct ahc_softc *ahc,
u_int instrptr, uint8_t *dconsts);
-static int ahc_probe_stack_size(struct ahc_softc *ahc);
#ifdef AHC_TARGET_MODE
static void ahc_queue_lstate_event(struct ahc_softc *ahc,
struct ahc_tmode_lstate *lstate,
@@ -1166,6 +1165,13 @@
ahc_name(ahc), scbptr, scb_index);
ahc_dump_card_state(ahc);
} else {
+#ifdef AHC_DEBUG
+ if ((ahc_debug & AHC_SHOW_SELTO) != 0) {
+ ahc_print_path(ahc, scb);
+ printf("Saw Selection Timeout for SCB 0x%x\n",
+ scb_index);
+ }
+#endif
/*
* Force a renegotiation with this target just in
* case the cable was pulled and will later be
@@ -1178,13 +1184,6 @@
ahc_force_renegotiation(ahc);
ahc_set_transaction_status(scb, CAM_SEL_TIMEOUT);
ahc_freeze_devq(ahc, scb);
-#ifdef AHC_DEBUG
- if ((ahc_debug & AHC_SHOW_SELTO) != 0) {
- ahc_print_path(ahc, scb);
- printf("Saw Selection Timeout for SCB 0x%x\n",
- scb_index);
- }
-#endif
}
ahc_outb(ahc, CLRINT, CLRSCSIINT);
ahc_restart(ahc);
@@ -4005,8 +4004,6 @@
free(ahc->name, M_DEVBUF);
if (ahc->seep_config != NULL)
free(ahc->seep_config, M_DEVBUF);
- if (ahc->saved_stack != NULL)
- free(ahc->saved_stack, M_DEVBUF);
#ifndef __FreeBSD__
free(ahc, M_DEVBUF);
#endif
@@ -4542,12 +4539,6 @@
size_t driver_data_size;
uint32_t physaddr;
- ahc->stack_size = ahc_probe_stack_size(ahc);
- ahc->saved_stack = malloc(ahc->stack_size * sizeof(uint16_t),
- M_DEVBUF, M_NOWAIT);
- if (ahc->saved_stack == NULL)
- return (ENOMEM);
-
#ifdef AHC_DEBUG_SEQUENCER
ahc->flags |= AHC_SEQUENCER_DEBUG;
#endif
@@ -4602,7 +4593,8 @@
/*lowaddr*/BUS_SPACE_MAXADDR,
/*highaddr*/BUS_SPACE_MAXADDR,
/*filter*/NULL, /*filterarg*/NULL,
- /*maxsize*/MAXBSIZE, /*nsegments*/AHC_NSEG,
+ /*maxsize*/(AHC_NSEG - 1) * PAGE_SIZE,
+ /*nsegments*/AHC_NSEG,
/*maxsegsz*/AHC_MAXTRANSFER_SIZE,
/*flags*/BUS_DMA_ALLOCNOW,
&ahc->buffer_dmat) != 0) {
@@ -6275,7 +6267,8 @@
#ifdef AHC_DEBUG
if ((ahc_debug & AHC_SHOW_MISC) != 0) {
ahc_print_path(ahc, scb);
- printf("Handled Residual of %d bytes\n", resid);
+ printf("Handled %sResidual of %d bytes\n",
+ (scb->flags & SCB_SENSE) ? "Sense " : "", resid);
}
#endif
}
@@ -6655,41 +6648,6 @@
}
}
-static int
-ahc_probe_stack_size(struct ahc_softc *ahc)
-{
- int last_probe;
-
- last_probe = 0;
- while (1) {
- int i;
-
- /*
- * We avoid using 0 as a pattern to avoid
- * confusion if the stack implementation
- * "back-fills" with zeros when "poping'
- * entries.
- */
- for (i = 1; i <= last_probe+1; i++) {
- ahc_outb(ahc, STACK, i & 0xFF);
- ahc_outb(ahc, STACK, (i >> 8) & 0xFF);
- }
-
- /* Verify */
- for (i = last_probe+1; i > 0; i--) {
- u_int stack_entry;
-
- stack_entry = ahc_inb(ahc, STACK)
- |(ahc_inb(ahc, STACK) << 8);
- if (stack_entry != i)
- goto sized;
- }
- last_probe++;
- }
-sized:
- return (last_probe);
-}
-
int
ahc_print_register(ahc_reg_parse_entry_t *table, u_int num_entries,
const char *name, u_int address, u_int value,
@@ -6768,6 +6726,7 @@
cur_col = 0;
if ((ahc->features & AHC_DT) != 0)
ahc_scsisigi_print(ahc_inb(ahc, SCSISIGI), &cur_col, 50);
+ ahc_error_print(ahc_inb(ahc, ERROR), &cur_col, 50);
ahc_scsiphase_print(ahc_inb(ahc, SCSIPHASE), &cur_col, 50);
ahc_scsibusl_print(ahc_inb(ahc, SCSIBUSL), &cur_col, 50);
ahc_lastphase_print(ahc_inb(ahc, LASTPHASE), &cur_col, 50);
@@ -6787,11 +6746,8 @@
if (cur_col != 0)
printf("\n");
printf("STACK:");
- for (i = 0; i < ahc->stack_size; i++) {
- ahc->saved_stack[i] =
- ahc_inb(ahc, STACK)|(ahc_inb(ahc, STACK) << 8);
- printf(" 0x%x", ahc->saved_stack[i]);
- }
+ for (i = 0; i < STACK_SIZE; i++)
+ printf(" 0x%x", ahc_inb(ahc, STACK)|(ahc_inb(ahc, STACK) << 8));
printf("\nSCB count = %d\n", ahc->scb_data->numscbs);
printf("Kernel NEXTQSCB = %d\n", ahc->next_queued_scb->hscb->tag);
printf("Card NEXTQSCB = %d\n", ahc_inb(ahc, NEXT_QUEUED_SCB));
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c Tue Jan 7 20:41:21 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c Tue Jan 7 20:41:21 2003
@@ -1,7 +1,7 @@
/*
* Adaptec AIC7xxx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#166 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#169 $
*
* Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science.
@@ -576,6 +576,7 @@
static void ahc_linux_setup_tag_info(char *p, char *end, char *s);
static void ahc_linux_setup_tag_info_global(char *p);
static void ahc_linux_setup_dv(char *p, char *end, char *s);
+static int aic7xxx_setup(char *s);
static int ahc_linux_next_unit(void);
static void ahc_runq_tasklet(unsigned long data);
static int ahc_linux_halt(struct notifier_block *nb, u_long event, void *buf);
@@ -1297,6 +1298,7 @@
*/
.max_sectors = 8192,
#endif
+#if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
/* Assume RedHat Distribution with its different HIGHIO conventions. */
.can_dma_32 = 1,
@@ -1304,6 +1306,7 @@
#else
.highmem_io = 1,
#endif
+#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
.name = "aic7xxx",
.slave_alloc = ahc_linux_slave_alloc,
@@ -1764,7 +1767,7 @@
* to a parameter with a ':' between the parameter and the value.
* ie. aic7xxx=stpwlev:1,extended
*/
-int
+static int
aic7xxx_setup(char *s)
{
int i, n;
@@ -1888,7 +1891,7 @@
* negotiation will occur for the first command, and DV
* will comence should that first command be successful.
*/
- for (target = 0; target < AHC_NUM_TARGETS; target++) {
+ for (target = 0; target < host->max_id*host->max_channel+1; target++) {
u_int channel;
channel = 0;
@@ -2732,6 +2735,22 @@
AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
break;
}
+#ifdef AHC_DEBUG
+ if (ahc_debug & AHC_SHOW_DV) {
+ int i;
+
+ ahc_print_devinfo(ahc, devinfo);
+ printf("Inquiry buffer mismatch:");
+ for (i = 0; i < AHC_LINUX_DV_INQ_LEN; i++) {
+ if ((i & 0xF) == 0)
+ printf("\n ");
+ printf("0x%x:0x0%x ",
+ ((uint8_t *)targ->inq_data)[i],
+ targ->dv_buffer[i]);
+ }
+ printf("\n");
+ }
+#endif
if (ahc_linux_fallback(ahc, devinfo) != 0) {
AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
@@ -3365,6 +3384,8 @@
targ->dv_next_narrow_period = MAX(period, AHC_SYNCRATE_ULTRA2);
if (targ->dv_next_wide_period == 0)
targ->dv_next_wide_period = period;
+ if (targ->dv_max_width == 0)
+ targ->dv_max_width = width;
if (targ->dv_max_ppr_options == 0)
targ->dv_max_ppr_options = ppr_options;
if (targ->dv_last_ppr_options == 0)
@@ -3459,7 +3480,7 @@
period++;
}
} else if ((ahc->features & AHC_WIDE) != 0
- && tinfo->user.width != 0
+ && targ->dv_max_width != 0
&& wide_speed >= fallback_speed
&& (targ->dv_next_wide_period <= AHC_ASYNC_XFER_PERIOD
|| period >= AHC_ASYNC_XFER_PERIOD)) {
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.h Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h Tue Jan 7 20:41:22 2003
@@ -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#114 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#118 $
*
*/
#ifndef _AIC7XXX_LINUX_H_
@@ -72,7 +72,6 @@
#endif
#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))
@@ -302,7 +301,7 @@
#include <linux/smp.h>
#endif
-#define AIC7XXX_DRIVER_VERSION "6.2.25"
+#define AIC7XXX_DRIVER_VERSION "6.2.26"
/**************************** Front End Queues ********************************/
/*
@@ -472,10 +471,11 @@
/*
* The next "fallback" period to use for narrow/wide transfers.
*/
- u_int dv_next_narrow_period;
- u_int dv_next_wide_period;
- u_int dv_max_ppr_options;
- u_int dv_last_ppr_options;
+ uint8_t dv_next_narrow_period;
+ uint8_t dv_next_wide_period;
+ uint8_t dv_max_width;
+ uint8_t dv_max_ppr_options;
+ uint8_t dv_last_ppr_options;
u_int dv_echo_size;
ahc_dv_state dv_state;
u_int dv_state_retry;
@@ -864,6 +864,7 @@
#define PCIM_CMD_BUSMASTEREN 0x0004
#define PCIM_CMD_MWRICEN 0x0010
#define PCIM_CMD_PERRESPEN 0x0040
+#define PCIM_CMD_SERRESPEN 0x0100
#define PCIR_STATUS 0x06
#define PCIR_REVID 0x08
#define PCIR_PROGIF 0x09
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c Tue Jan 7 20:41:22 2003
@@ -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#42 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#43 $
*/
#include "aic7xxx_osm.h"
@@ -167,8 +167,8 @@
ahc->platform_data->hw_dma_mask =
(bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
} else {
- ahc_pci_set_dma_mask(pdev, 0xffffffffULL);
- ahc->platform_data->hw_dma_mask = 0xffffffffULL;
+ ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF);
+ ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
}
#endif
ahc->dev_softc = pci;
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c
--- a/drivers/scsi/aic7xxx/aic7xxx_pci.c Tue Jan 7 20:41:21 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c Tue Jan 7 20:41:21 2003
@@ -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#54 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#55 $
*
* $FreeBSD$
*/
@@ -1202,15 +1202,20 @@
int
ahc_pci_test_register_access(struct ahc_softc *ahc)
{
- int error;
- u_int status1;
- uint8_t seqctl;
+ int error;
+ u_int status1;
+ uint32_t cmd;
+ uint8_t hcntrl;
error = EIO;
- /* Enable PCI error interrupt status */
- seqctl = ahc_inb(ahc, SEQCTL);
- ahc_outb(ahc, SEQCTL, seqctl & ~FAILDIS);
+ /*
+ * Enable PCI error interrupt status, but suppress NMIs
+ * generated by SERR raised due to target aborts.
+ */
+ cmd = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
+ ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
+ cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
/*
* First a simple test to see if any
@@ -1220,7 +1225,8 @@
* be zero so it is a good register to
* use for this test.
*/
- if (ahc_inb(ahc, HCNTRL) == 0xFF)
+ hcntrl = ahc_inb(ahc, HCNTRL);
+ if (hcntrl == 0xFF)
goto fail;
/*
@@ -1230,8 +1236,13 @@
* either, so look for data corruption and/or flagged
* PCI errors.
*/
- ahc_outl(ahc, SRAM_BASE, 0x5aa555aa);
- if (ahc_inl(ahc, SRAM_BASE) != 0x5aa555aa)
+ ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
+ while (ahc_is_paused(ahc) == 0)
+ ;
+ ahc_outb(ahc, SEQCTL, PERRORDIS);
+ ahc_outb(ahc, SCBPTR, 0);
+ ahc_outl(ahc, SCB_BASE, 0x5aa555aa);
+ if (ahc_inl(ahc, SCB_BASE) != 0x5aa555aa)
goto fail;
status1 = ahc_pci_read_config(ahc->dev_softc,
@@ -1248,7 +1259,8 @@
ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
status1, /*bytes*/1);
ahc_outb(ahc, CLRINT, CLRPARERR);
- ahc_outb(ahc, SEQCTL, seqctl);
+ ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
+ ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
return (error);
}
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped b/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped Tue Jan 7 20:41:22 2003
@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#52 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#36 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#53 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
*/
typedef int (ahc_reg_print_t)(u_int, u_int *, u_int);
typedef struct ahc_reg_parse_entry {
@@ -1779,6 +1779,7 @@
#define MAX_OFFSET 0xff
#define BUS_16_BIT 0x01
#define SCB_UPLOAD_SIZE 0x20
+#define STACK_SIZE 0x04
/* Downloaded Constant Definitions */
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped b/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped Tue Jan 7 20:41:22 2003
@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#52 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#36 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#53 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
*/
#include "aic7xxx_osm.h"
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped b/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped Tue Jan 7 20:41:22 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped Tue Jan 7 20:41:22 2003
@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated
* from the following source files:
*
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#52 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#36 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#53 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
*/
static uint8_t seqprog[] = {
0xb2, 0x00, 0x00, 0x08,
diff -Nru a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
--- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y Tue Jan 7 20:41:21 2003
+++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y Tue Jan 7 20:41:22 2003
@@ -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/aicasm/aicasm_gram.y#28 $
+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#29 $
*
* $FreeBSD$
*/
@@ -209,7 +209,7 @@
%type <value> export ret f1_opcode f2_opcode jmp_jc_jnc_call jz_jnz je_jne
-%type <value> numerical_value mode_value mode_list macro_arglist
+%type <value> mode_value mode_list macro_arglist
%left '|'
%left '&'
@@ -781,17 +781,6 @@
}
$$ = $1 + 1;
add_macro_arg($3, $1);
- }
-;
-
-numerical_value:
- T_NUMBER
- {
- $$ = $1;
- }
-| '-' T_NUMBER
- {
- $$ = -$2;
}
;
===================================================================
This BitKeeper patch contains the following changesets:
1.893..1.893.1.4
## Wrapped with gzip_uu ##
begin 664 bkpatch12837
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
*[2]EW9025G$`````
`
end
^ permalink raw reply [flat|nested] 12+ messages in thread