Commit 4a87785d authored by Justin T. Gibbs's avatar Justin T. Gibbs

Merge http://linux.bkbits.net/linux-2.5

into overdrive.btc.adaptec.com:/usr/home/gibbs/bk/linux-2.5
parents 5882eeaf aba82a6c
...@@ -277,57 +277,8 @@ config SCSI_AACRAID ...@@ -277,57 +277,8 @@ config SCSI_AACRAID
tristate "Adaptec AACRAID support (EXPERIMENTAL)" tristate "Adaptec AACRAID support (EXPERIMENTAL)"
depends on EXPERIMENTAL && SCSI && PCI depends on EXPERIMENTAL && SCSI && PCI
choice
prompt "Adaptec AIC7xxx support"
optional
depends on SCSI
source "drivers/scsi/aic7xxx/Kconfig" source "drivers/scsi/aic7xxx/Kconfig"
config SCSI_AIC7XXX_OLD
tristate "Old driver"
help
WARNING This driver is an older aic7xxx driver and is no longer
under active development. Adaptec, Inc. is writing a new driver to
take the place of this one, and it is recommended that whenever
possible, people should use the new Adaptec written driver instead
of this one. This driver will eventually be phased out entirely.
This is support for the various aic7xxx based Adaptec SCSI
controllers. These include the 274x EISA cards; 284x VLB cards;
2902, 2910, 293x, 294x, 394x, 3985 and several other PCI and
motherboard based SCSI controllers from Adaptec. It does not support
the AAA-13x RAID controllers from Adaptec, nor will it likely ever
support them. It does not support the 2920 cards from Adaptec that
use the Future Domain SCSI controller chip. For those cards, you
need the "Future Domain 16xx SCSI support" driver.
In general, if the controller is based on an Adaptec SCSI controller
chip from the aic777x series or the aic78xx series, this driver
should work. The only exception is the 7810 which is specifically
not supported (that's the RAID controller chip on the AAA-13x
cards).
Note that the AHA2920 SCSI host adapter is *not* supported by this
driver; choose "Future Domain 16xx SCSI support" instead if you have
one of those.
Information on the configuration options for this controller can be
found by checking the help file for each of the available
configuration options. You should read
<file:Documentation/scsi/aic7xxx_old.txt> at a minimum before
contacting the maintainer with any questions. The SCSI-HOWTO,
available from <http://www.linuxdoc.org/docs.html#howto>, can also
be of great help.
If you want to compile this 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_old.o.
endchoice
# All the I2O code and drivers do not seem to be 64bit safe. # All the I2O code and drivers do not seem to be 64bit safe.
config SCSI_DPT_I2O config SCSI_DPT_I2O
tristate "Adaptec I2O RAID support " tristate "Adaptec I2O RAID support "
......
#
# AIC7XXX and AIC79XX 2.5.X Kernel configuration File.
# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig#2 $
#
config SCSI_AIC7XXX config SCSI_AIC7XXX
tristate "New driver" tristate "Adaptec AIC7xxx Fast -> U160 support"
help ---help---
This driver supports all of Adaptec's PCI based SCSI controllers This driver supports all of Adaptec's Fast through Ultra 160 PCI
(not the hardware RAID controllers though) as well as the aic7770 based SCSI controllers as well as the aic7770 based EISA and VLB
based EISA and VLB SCSI controllers (the 274x and 284x series). SCSI controllers (the 274x and 284x series). For AAA and ARO based
This is an Adaptec sponsored driver written by Justin Gibbs. It is configurations, only SCSI functionality is provided.
intended to replace the previous aic7xxx driver maintained by Doug
Ledford since Doug is no longer maintaining that driver.
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.o.
config AIC7XXX_CMDS_PER_DEVICE config AIC7XXX_CMDS_PER_DEVICE
int "Maximum number of TCQ commands per device" int "Maximum number of TCQ commands per device"
depends on SCSI_AIC7XXX depends on SCSI_AIC7XXX
default "253" default "32"
---help--- ---help---
Specify the number of commands you would like to allocate per SCSI Specify the number of commands you would like to allocate per SCSI
device when Tagged Command Queueing (TCQ) is enabled on that device. device when Tagged Command Queueing (TCQ) is enabled on that device.
This is an upper bound value for the number of tagged transactions This is an upper bound value for the number of tagged transactions
to be used for any device. The aic7xxx driver will automatically to be used for any device. The aic7xxx driver will automatically
vary this number based on device behavior. For devices with a vary this number based on device behavior. For devices with a
fixed maximum, the driver will eventually lock to this maximum fixed maximum, the driver will eventually lock to this maximum
and display a console message inidicating this value. and display a console message inidicating this value.
Note: Unless you experience some type of device failure, the default Due to resource allocation issues in the Linux SCSI mid-layer, using
value, no enforced limit, should work for you. a high number of commands per device may result in memory allocation
failures when many devices are attached to the system. For this reason,
the default is set to 32. Higher values may result in higer performance
on some devices. The upper bound is 253. 0 disables tagged queueing.
Default: 253 Per device tag depth can be controlled via the kernel command line
"tag_info" option. See drivers/scsi/aic7xxx/README.aic7xxx
for details.
config AIC7XXX_RESET_DELAY_MS config AIC7XXX_RESET_DELAY_MS
int "Initial bus reset delay in milli-seconds" int "Initial bus reset delay in milli-seconds"
depends on SCSI_AIC7XXX depends on SCSI_AIC7XXX
default "15000" default "15000"
help ---help---
The number of milliseconds to delay after an initial bus reset. The number of milliseconds to delay after an initial bus reset.
The bus settle delay following all error recovery actions is The bus settle delay following all error recovery actions is
dictated by the SCSI layer and is not affected by this value. dictated by the SCSI layer and is not affected by this value.
Default: 15000 (15 seconds) Default: 15000 (15 seconds)
config AIC7XXX_PROBE_EISA_VL
bool "Probe for EISA and VL AIC7XXX Adapters"
help
Probe for EISA and VLB Aic7xxx controllers. In many newer systems,
the invasive probes necessary to detect these controllers can cause
other devices to fail. For this reason, the non-PCI probe code is
disabled by default. The current value of this option can be "toggled"
via the no_probe kernel command line option.
config AIC7XXX_BUILD_FIRMWARE config AIC7XXX_BUILD_FIRMWARE
bool "Build Adapter Firmware with Kernel Build" bool "Build Adapter Firmware with Kernel Build"
depends on SCSI_AIC7XXX depends on SCSI_AIC7XXX
help help
This option should only be enabled if you are modifying the firmware This option should only be enabled if you are modifying the firmware
source to the aic7xxx driver and wish to have the generated firmware source to the aic7xxx driver and wish to have the generated firmware
include files updated during a normal kernel build. The assembler include files updated during a normal kernel build. The assembler
for the firmware requires lex and yacc or their equivalents, as well for the firmware requires lex and yacc or their equivalents, as well
as the db v1 library. You may have to install additional packages as the db v1 library. You may have to install additional packages
or modify the assembler make file or the files it includes if your or modify the assembler Makefile or the files it includes if your
build environment is different than that of the author. build environment is different than that of the author.
config AIC7XXX_DEBUG_ENABLE
bool "Compile in Debugging Code"
depends on SCSI_AIC7XXX
default y
help
Compile in aic7xxx debugging code that can be useful in diagnosing
driver errors.
config AIC7XXX_DEBUG_MASK
int "Debug code enable mask (2047 for all debugging)"
depends on SCSI_AIC7XXX
default "0"
help
Bit mask of debug options that is only valid if the
CONFIG_AIC7XXX_DEBUG_ENBLE option is enabled. The bits in this mask
are defined in the drivers/scsi/aic7xxx/aic7xxx.h - search for the
variable ahc_debug in that file to find them.
config AIC7XXX_REG_PRETTY_PRINT
bool "Decode registers during diagnostics"
depends on SCSI_AIC7XXX
default y
help
Compile in register value tables for the output of expanded register
contents in diagnostics. This make it much easier to understand debug
output without having to refer to a data book and/or the aic7xxx.reg
file.
config SCSI_AIC79XX
tristate "Adaptec AIC79xx U320 support"
help
This driver supports all of Adaptec's Ultra 320 PCI-X
based SCSI controllers.
config AIC79XX_CMDS_PER_DEVICE
int "Maximum number of TCQ commands per device"
depends on SCSI_AIC79XX
default "32"
---help---
Specify the number of commands you would like to allocate per SCSI
device when Tagged Command Queueing (TCQ) is enabled on that device.
This is an upper bound value for the number of tagged transactions
to be used for any device. The aic7xxx driver will automatically
vary this number based on device behavior. For devices with a
fixed maximum, the driver will eventually lock to this maximum
and display a console message inidicating this value.
Due to resource allocation issues in the Linux SCSI mid-layer, using
a high number of commands per device may result in memory allocation
failures when many devices are attached to the system. For this reason,
the default is set to 32. Higher values may result in higer performance
on some devices. The upper bound is 253. 0 disables tagged queueing.
Per device tag depth can be controlled via the kernel command line
"tag_info" option. See drivers/scsi/aic7xxx/README.aic79xx
for details.
config AIC79XX_RESET_DELAY_MS
int "Initial bus reset delay in milli-seconds"
depends on SCSI_AIC79XX
default "15000"
---help---
The number of milliseconds to delay after an initial bus reset.
The bus settle delay following all error recovery actions is
dictated by the SCSI layer and is not affected by this value.
Default: 15000 (15 seconds)
config AIC79XX_BUILD_FIRMWARE
bool "Build Adapter Firmware with Kernel Build"
depends on SCSI_AIC79XX
help
This option should only be enabled if you are modifying the firmware
source to the aic79xx driver and wish to have the generated firmware
include files updated during a normal kernel build. The assembler
for the firmware requires lex and yacc or their equivalents, as well
as the db v1 library. You may have to install additional packages
or modify the assembler Makefile or the files it includes if your
build environment is different than that of the author.
config AIC79XX_ENABLE_RD_STRM
bool "Enable Read Streaming for All Targets"
depends on SCSI_AIC79XX
help
Read Streaming is a U320 protocol option that should enhance
performance. Early U320 drive firmware actually performs slower
with read streaming enabled so it is disabled by default. Read
Streaming can be configured in much the same way as tagged queueing
using the "rd_strm" command line option. See
drivers/scsi/aic7xxx/README.aic79xx for details.
config AIC79XX_DEBUG_ENABLE
bool "Compile in Debugging Code"
depends on SCSI_AIC79XX
default y
help
Compile in aic79xx debugging code that can be useful in diagnosing
driver errors.
config AIC79XX_DEBUG_MASK
int "Debug code enable mask (16383 for all debugging)"
depends on SCSI_AIC79XX
default "0"
help
Bit mask of debug options that is only valid if the
CONFIG_AIC79XX_DEBUG_ENBLE option is enabled. The bits in this mask
are defined in the drivers/scsi/aic7xxx/aic79xx.h - search for the
variable ahd_debug in that file to find them.
config AIC79XX_REG_PRETTY_PRINT
bool "Decode registers during diagnostics"
depends on SCSI_AIC79XX
default y
help
Compile in register value tables for the output of expanded register
contents in diagnostics. This make it much easier to understand debug
output without having to refer to a data book and/or the aic7xxx.reg
file.
...@@ -2,46 +2,86 @@ ...@@ -2,46 +2,86 @@
# Makefile for the Linux aic7xxx SCSI driver. # Makefile for the Linux aic7xxx SCSI driver.
# #
# Let kbuild descend into aicasm when cleaning # Let kbuild descend into aicasm when cleaning
#
# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#1 $
#
subdir- += aicasm subdir- += aicasm
obj-$(CONFIG_SCSI_AIC7XXX) += aic7xxx.o obj-$(CONFIG_SCSI_AIC7XXX) += aic7xxx.o
ifeq ($(CONFIG_PCI),y)
obj-$(CONFIG_SCSI_AIC79XX) += aic79xx.o
endif
# Core files # Core files
aic7xxx-objs += aic7xxx_core.o aic7xxx_93cx6.o aic7770.o aic7xxx-objs += aic7xxx_core.o aic7xxx_93cx6.o aic7770.o
# Platform Specific Files # Platform Specific Files
aic7xxx-objs += aic7xxx_linux.o aic7xxx_proc.o aic7770_linux.o aic7xxx-objs += aic7xxx_osm.o aic7xxx_proc.o aic7770_osm.o
ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
aic7xxx-objs += aic7xxx_reg_print.o
endif
# PCI Specific Files # PCI Specific Files
ifeq ($(CONFIG_PCI),y) ifeq ($(CONFIG_PCI),y)
# Core PCI files # Core PCI files
aic7xxx-objs += aic7xxx_pci.o aic7xxx-objs += aic7xxx_pci.o
# Platform Specific PCI Files # Platform Specific PCI Files
aic7xxx-objs += aic7xxx_linux_pci.o aic7xxx-objs += aic7xxx_osm_pci.o
endif
# Platform Specific U320 Files
aic79xx-objs = aic79xx_osm.o aic79xx_proc.o aic79xx_osm_pci.o
# Core Files
aic79xx-objs += aic79xx_core.o aic79xx_pci.o
ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
aic79xx-objs += aic79xx_reg_print.o
endif endif
EXTRA_CFLAGS += -I$(src)/..
#EXTRA_CFLAGS += -g #EXTRA_CFLAGS += -g
# Files generated that shall be removed upon make clean # Files generated that shall be removed upon make clean
clean-files := aic7xxx_seq.h aic7xxx_reg.h clean-files := aic7xxx_seq.h aic7xxx_reg.h aic7xxx_reg_print.c
clean-files += aic79xx_seq.h aic79xx_reg.h aic79xx_reg_print.c
# Dependencies for generated files need to be listed explicitly # Dependencies for generated files need to be listed explicitly
$(obj)/aic7xxx_core.o: $(obj)/aic7xxx_seq.h $(obj)/aic7xxx_core.o: $(obj)/aic7xxx_seq.h
$(obj)/aic79xx_core.o: $(obj)/aic79xx_seq.h
$(addprefix $(obj)/,$(aic7xxx-objs)): $(obj)/aic7xxx_reg.h $(addprefix $(obj)/,$(aic7xxx-objs)): $(obj)/aic7xxx_reg.h
$(addprefix $(obj)/,$(aic79xx-objs)): $(obj)/aic79xx_reg.h
ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y) 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 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
endif
$(obj)/aic7xxx_seq.h: $(src)/aic7xxx.seq $(src)/aic7xxx.reg \ $(aic7xxx_gen): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm
$(obj)/aicasm/aicasm $(aic7xxx_asm_cmd)
$(obj)/aicasm/aicasm -I$(obj) -r $(obj)/aic7xxx_reg.h \ endif
-o $(obj)/aic7xxx_seq.h $(src)/aic7xxx.seq
$(obj)/aic7xxx_reg.h: $(obj)/aic7xxx_seq.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 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
endif
$(aic79xx_gen): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm
$(aic79xx_asm_cmd)
endif
$(obj)/aicasm/aicasm: $(src)/aicasm/*.[chyl] $(obj)/aicasm/aicasm: $(src)/aicasm/*.[chyl]
$(MAKE) -C $(src)/aicasm $(MAKE) -C $(src)/aicasm
endif
This diff is collapsed.
This diff is collapsed.
...@@ -37,22 +37,29 @@ ...@@ -37,22 +37,29 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic7770.c#14 $ * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#27 $
* *
* $FreeBSD: src/sys/dev/aic7xxx/aic7770.c,v 1.1 2000/09/16 20:02:27 gibbs Exp $ * $FreeBSD$
*/ */
#ifdef __linux__
#include "aic7xxx_osm.h" #include "aic7xxx_osm.h"
#include "aic7xxx_inline.h" #include "aic7xxx_inline.h"
#include "aic7xxx_93cx6.h" #include "aic7xxx_93cx6.h"
#else
#include <dev/aic7xxx/aic7xxx_osm.h>
#include <dev/aic7xxx/aic7xxx_inline.h>
#include <dev/aic7xxx/aic7xxx_93cx6.h>
#endif
#define ID_AIC7770 0x04907770 #define ID_AIC7770 0x04907770
#define ID_AHA_274x 0x04907771 #define ID_AHA_274x 0x04907771
#define ID_AHA_284xB 0x04907756 /* BIOS enabled */ #define ID_AHA_284xB 0x04907756 /* BIOS enabled */
#define ID_AHA_284x 0x04907757 /* BIOS disabled*/ #define ID_AHA_284x 0x04907757 /* BIOS disabled*/
#define ID_AIC_7782 0x04907782 #define ID_OLV_274x 0x04907782 /* Olivetti OEM */
#define ID_OLV_274xD 0x04907783 /* Olivetti OEM (Differential) */
static void aha2840_load_seeprom(struct ahc_softc *ahc); static int aha2840_load_seeprom(struct ahc_softc *ahc);
static ahc_device_setup_t ahc_aic7770_VL_setup; static ahc_device_setup_t ahc_aic7770_VL_setup;
static ahc_device_setup_t ahc_aic7770_EISA_setup;; static ahc_device_setup_t ahc_aic7770_EISA_setup;;
static ahc_device_setup_t ahc_aic7770_setup; static ahc_device_setup_t ahc_aic7770_setup;
...@@ -72,18 +79,23 @@ struct aic7770_identity aic7770_ident_table [] = ...@@ -72,18 +79,23 @@ struct aic7770_identity aic7770_ident_table [] =
"Adaptec 284X SCSI adapter", "Adaptec 284X SCSI adapter",
ahc_aic7770_VL_setup ahc_aic7770_VL_setup
}, },
/* Generic chip probes for devices we don't know 'exactly' */
{ {
ID_AIC7770, ID_OLV_274x,
0xFFFFFFFF, 0xFFFFFFFF,
"Adaptec aic7770 SCSI adapter", "Adaptec (Olivetti OEM) 274X SCSI adapter",
ahc_aic7770_EISA_setup ahc_aic7770_EISA_setup
}, },
{ {
/* (Olivetti 2 channel EISA) */ ID_OLV_274xD,
ID_AIC_7782,
0xFFFFFFFF, 0xFFFFFFFF,
"Adaptec aic7782 SCSI adapter", "Adaptec (Olivetti OEM) 274X Differential SCSI adapter",
ahc_aic7770_EISA_setup
},
/* Generic chip probes for devices we don't know 'exactly' */
{
ID_AIC7770,
0xFFFFFFFF,
"Adaptec aic7770 SCSI adapter",
ahc_aic7770_EISA_setup ahc_aic7770_EISA_setup
} }
}; };
...@@ -104,21 +116,32 @@ aic7770_find_device(uint32_t id) ...@@ -104,21 +116,32 @@ aic7770_find_device(uint32_t id)
} }
int int
aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry) aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry, u_int io)
{ {
u_long l;
int error; int error;
int have_seeprom;
u_int hostconf; u_int hostconf;
u_int irq; u_int irq;
u_int intdef; u_int intdef;
error = entry->setup(ahc); error = entry->setup(ahc);
have_seeprom = 0;
if (error != 0) if (error != 0)
return (error); return (error);
error = aic7770_map_registers(ahc); error = aic7770_map_registers(ahc, io);
if (error != 0) if (error != 0)
return (error); return (error);
/*
* Before we continue probing the card, ensure that
* its interrupts are *disabled*. We don't want
* a misstep to hang the machine in an interrupt
* storm.
*/
ahc_intr_enable(ahc, FALSE);
ahc->description = entry->name; ahc->description = entry->name;
error = ahc_softc_init(ahc); error = ahc_softc_init(ahc);
...@@ -176,21 +199,22 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry) ...@@ -176,21 +199,22 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry)
ahc->flags |= AHC_TERM_ENB_B; ahc->flags |= AHC_TERM_ENB_B;
} }
} }
/* if ((ahc_inb(ahc, HA_274_BIOSGLOBAL) & HA_274_EXTENDED_TRANS))
* We have no way to tell, so assume extended ahc->flags |= AHC_EXTENDED_TRANS_A|AHC_EXTENDED_TRANS_B;
* translation is enabled.
*/
ahc->flags |= AHC_EXTENDED_TRANS_A|AHC_EXTENDED_TRANS_B;
break; break;
} }
case AHC_VL: case AHC_VL:
{ {
aha2840_load_seeprom(ahc); have_seeprom = aha2840_load_seeprom(ahc);
break; break;
} }
default: default:
break; break;
} }
if (have_seeprom == 0) {
free(ahc->seep_config, M_DEVBUF);
ahc->seep_config = NULL;
}
/* /*
* Ensure autoflush is enabled * Ensure autoflush is enabled
...@@ -209,24 +233,22 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry) ...@@ -209,24 +233,22 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry)
if (error != 0) if (error != 0)
return (error); return (error);
error = aic7770_map_int(ahc, irq);
if (error != 0)
return (error);
ahc_list_lock(&l);
/* /*
* Link this softc in with all other ahc instances. * Link this softc in with all other ahc instances.
*/ */
ahc_softc_insert(ahc); ahc_softc_insert(ahc);
error = aic7770_map_int(ahc, irq);
if (error != 0)
return (error);
/* /*
* Enable the board's BUS drivers * Enable the board's BUS drivers
*/ */
ahc_outb(ahc, BCTL, ENABLE); ahc_outb(ahc, BCTL, ENABLE);
/* ahc_list_unlock(&l);
* Allow interrupts.
*/
ahc_intr_enable(ahc, TRUE);
return (0); return (0);
} }
...@@ -234,14 +256,13 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry) ...@@ -234,14 +256,13 @@ aic7770_config(struct ahc_softc *ahc, struct aic7770_identity *entry)
/* /*
* Read the 284x SEEPROM. * Read the 284x SEEPROM.
*/ */
static void static int
aha2840_load_seeprom(struct ahc_softc *ahc) aha2840_load_seeprom(struct ahc_softc *ahc)
{ {
struct seeprom_descriptor sd; struct seeprom_descriptor sd;
struct seeprom_config sc; struct seeprom_config *sc;
uint16_t checksum = 0; int have_seeprom;
uint8_t scsi_conf; uint8_t scsi_conf;
int have_seeprom;
sd.sd_ahc = ahc; sd.sd_ahc = ahc;
sd.sd_control_offset = SEECTL_2840; sd.sd_control_offset = SEECTL_2840;
...@@ -254,23 +275,16 @@ aha2840_load_seeprom(struct ahc_softc *ahc) ...@@ -254,23 +275,16 @@ aha2840_load_seeprom(struct ahc_softc *ahc)
sd.sd_CK = CK_2840; sd.sd_CK = CK_2840;
sd.sd_DO = DO_2840; sd.sd_DO = DO_2840;
sd.sd_DI = DI_2840; sd.sd_DI = DI_2840;
sc = ahc->seep_config;
if (bootverbose) if (bootverbose)
printf("%s: Reading SEEPROM...", ahc_name(ahc)); printf("%s: Reading SEEPROM...", ahc_name(ahc));
have_seeprom = read_seeprom(&sd, have_seeprom = ahc_read_seeprom(&sd, (uint16_t *)sc,
(uint16_t *)&sc, /*start_addr*/0, sizeof(sc)/2);
/*start_addr*/0,
sizeof(sc)/2);
if (have_seeprom) { if (have_seeprom) {
/* Check checksum */
int i; if (ahc_verify_cksum(sc) == 0) {
int maxaddr = (sizeof(sc)/2) - 1;
uint16_t *scarray = (uint16_t *)&sc;
for (i = 0; i < maxaddr; i++)
checksum = checksum + scarray[i];
if (checksum != sc.checksum) {
if(bootverbose) if(bootverbose)
printf ("checksum error\n"); printf ("checksum error\n");
have_seeprom = 0; have_seeprom = 0;
...@@ -288,41 +302,44 @@ aha2840_load_seeprom(struct ahc_softc *ahc) ...@@ -288,41 +302,44 @@ aha2840_load_seeprom(struct ahc_softc *ahc)
* Put the data we've collected down into SRAM * Put the data we've collected down into SRAM
* where ahc_init will find it. * where ahc_init will find it.
*/ */
int i; int i;
int max_targ = (ahc->features & AHC_WIDE) != 0 ? 16 : 8; int max_targ;
uint16_t discenable; uint16_t discenable;
max_targ = (ahc->features & AHC_WIDE) != 0 ? 16 : 8;
discenable = 0; discenable = 0;
for (i = 0; i < max_targ; i++){ for (i = 0; i < max_targ; i++){
uint8_t target_settings; uint8_t target_settings;
target_settings = (sc.device_flags[i] & CFXFER) << 4;
if (sc.device_flags[i] & CFSYNCH) target_settings = (sc->device_flags[i] & CFXFER) << 4;
if (sc->device_flags[i] & CFSYNCH)
target_settings |= SOFS; target_settings |= SOFS;
if (sc.device_flags[i] & CFWIDEB) if (sc->device_flags[i] & CFWIDEB)
target_settings |= WIDEXFER; target_settings |= WIDEXFER;
if (sc.device_flags[i] & CFDISC) if (sc->device_flags[i] & CFDISC)
discenable |= (0x01 << i); discenable |= (0x01 << i);
ahc_outb(ahc, TARG_SCSIRATE + i, target_settings); ahc_outb(ahc, TARG_SCSIRATE + i, target_settings);
} }
ahc_outb(ahc, DISC_DSB, ~(discenable & 0xff)); ahc_outb(ahc, DISC_DSB, ~(discenable & 0xff));
ahc_outb(ahc, DISC_DSB + 1, ~((discenable >> 8) & 0xff)); ahc_outb(ahc, DISC_DSB + 1, ~((discenable >> 8) & 0xff));
ahc->our_id = sc.brtime_id & CFSCSIID; ahc->our_id = sc->brtime_id & CFSCSIID;
scsi_conf = (ahc->our_id & 0x7); scsi_conf = (ahc->our_id & 0x7);
if (sc.adapter_control & CFSPARITY) if (sc->adapter_control & CFSPARITY)
scsi_conf |= ENSPCHK; scsi_conf |= ENSPCHK;
if (sc.adapter_control & CFRESETB) if (sc->adapter_control & CFRESETB)
scsi_conf |= RESET_SCSI; scsi_conf |= RESET_SCSI;
if (sc.bios_control & CF284XEXTEND) if (sc->bios_control & CF284XEXTEND)
ahc->flags |= AHC_EXTENDED_TRANS_A; ahc->flags |= AHC_EXTENDED_TRANS_A;
/* Set SCSICONF info */ /* Set SCSICONF info */
ahc_outb(ahc, SCSICONF, scsi_conf); ahc_outb(ahc, SCSICONF, scsi_conf);
if (sc.adapter_control & CF284XSTERM) if (sc->adapter_control & CF284XSTERM)
ahc->flags |= AHC_TERM_ENB_A; ahc->flags |= AHC_TERM_ENB_A;
} }
return (have_seeprom);
} }
static int static int
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_linux.c#9 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#11 $
*/ */
#include "aic7xxx_osm.h" #include "aic7xxx_osm.h"
...@@ -55,9 +55,6 @@ aic7770_linux_probe(Scsi_Host_Template *template) ...@@ -55,9 +55,6 @@ aic7770_linux_probe(Scsi_Host_Template *template)
int eisaBase; int eisaBase;
int found; int found;
if (aic7xxx_no_probe)
return (0);
eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET; eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET;
found = 0; found = 0;
for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) { for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) {
...@@ -103,10 +100,9 @@ aic7770_linux_probe(Scsi_Host_Template *template) ...@@ -103,10 +100,9 @@ aic7770_linux_probe(Scsi_Host_Template *template)
*/ */
break; break;
} }
ahc->tag = BUS_SPACE_PIO; error = aic7770_config(ahc, entry, eisaBase);
ahc->bsh.ioport = eisaBase;
error = aic7770_config(ahc, entry);
if (error != 0) { if (error != 0) {
ahc->bsh.ioport = 0;
ahc_free(ahc); ahc_free(ahc);
continue; continue;
} }
...@@ -120,18 +116,19 @@ aic7770_linux_probe(Scsi_Host_Template *template) ...@@ -120,18 +116,19 @@ aic7770_linux_probe(Scsi_Host_Template *template)
} }
int int
aic7770_map_registers(struct ahc_softc *ahc) aic7770_map_registers(struct ahc_softc *ahc, u_int port)
{ {
/* /*
* Lock out other contenders for our i/o space. * Lock out other contenders for our i/o space.
*/ */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
request_region(ahc->bsh.ioport, AHC_EISA_IOSIZE, "aic7xxx"); request_region(port, AHC_EISA_IOSIZE, "aic7xxx");
#else #else
if (request_region(ahc->bsh.ioport, AHC_EISA_IOSIZE, "aic7xxx") == 0) if (request_region(port, AHC_EISA_IOSIZE, "aic7xxx") == 0)
return (ENOMEM); return (ENOMEM);
#endif #endif
ahc->tag = BUS_SPACE_PIO;
ahc->bsh.ioport = port;
return (0); return (0);
} }
...@@ -145,9 +142,9 @@ aic7770_map_int(struct ahc_softc *ahc, u_int irq) ...@@ -145,9 +142,9 @@ aic7770_map_int(struct ahc_softc *ahc, u_int irq)
if ((ahc->flags & AHC_EDGE_INTERRUPT) == 0) if ((ahc->flags & AHC_EDGE_INTERRUPT) == 0)
shared = SA_SHIRQ; shared = SA_SHIRQ;
ahc->platform_data->irq = irq; error = request_irq(irq, ahc_linux_isr, shared, "aic7xxx", ahc);
error = request_irq(ahc->platform_data->irq, ahc_linux_isr, if (error == 0)
shared, "aic7xxx", ahc); ahc->platform_data->irq = irq;
return (-error); return (-error);
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* Adaptec AIC79xx device driver host template for Linux.
*
* Copyright (c) 2000-2001 Adaptec Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* 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_host.h#10 $
*/
#ifndef _AIC79XX_LINUX_HOST_H_
#define _AIC79XX_LINUX_HOST_H_
int ahd_linux_proc_info(char *, char **, off_t, int, int, int);
int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
int ahd_linux_detect(Scsi_Host_Template *);
int ahd_linux_release(struct Scsi_Host *);
const char *ahd_linux_info(struct Scsi_Host *);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
int ahd_linux_slave_alloc(Scsi_Device *);
int ahd_linux_slave_configure(Scsi_Device *);
void ahd_linux_slave_destroy(Scsi_Device *);
int ahd_linux_biosparam(struct scsi_device*, struct block_device*,
sector_t, int[]);
#else
void ahd_linux_select_queue_depth(struct Scsi_Host *host,
Scsi_Device *scsi_devs);
int ahd_linux_biosparam(Disk *, kdev_t, int[]);
#endif
int ahd_linux_bus_reset(Scsi_Cmnd *);
int ahd_linux_dev_reset(Scsi_Cmnd *);
int ahd_linux_abort(Scsi_Cmnd *);
#if defined(__i386__)
# define AIC79XX_BIOSPARAM ahd_linux_biosparam
#else
# define AIC79XX_BIOSPARAM NULL
#endif
/*
* Scsi_Host_Template (see hosts.h) for AIC-79xx - some fields
* to do with card config are filled in after the card is detected.
*/
#define AIC79XX_TEMPLATE_CORE \
proc_info: ahd_linux_proc_info, \
detect: ahd_linux_detect, \
release: ahd_linux_release, \
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, \
bios_param: AIC79XX_BIOSPARAM, \
can_queue: AHD_MAX_QUEUE,/* max simultaneous cmds */\
this_id: -1, /* scsi id of host adapter */\
sg_tablesize: AHD_NSEG, /* max scatter-gather cmds */\
cmd_per_lun: 2, /* cmds per lun */\
present: 0, /* number of 7xxx's present */\
unchecked_isa_dma: 0, /* no memory DMA restrictions*/\
use_clustering: ENABLE_CLUSTERING
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
#define AIC79XX { \
AIC79XX_TEMPLATE_CORE, \
slave_alloc: ahd_linux_slave_alloc, \
slave_configure: ahd_linux_slave_configure, \
slave_destroy: ahd_linux_slave_destroy \
}
#else
#define AIC79XX { \
AIC79XX_TEMPLATE_CORE, \
select_queue_depths: ahd_linux_select_queue_depth, \
use_new_eh_code: 1 \
}
#endif
#endif /* _AIC79XX_LINUX_HOST_H_ */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -37,9 +37,9 @@ ...@@ -37,9 +37,9 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#34 $ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#66 $
* *
* $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.30 2000/11/10 20:13:40 gibbs Exp $ * $FreeBSD$
*/ */
#ifndef _AIC7XXX_H_ #ifndef _AIC7XXX_H_
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
/************************* Forward Declarations *******************************/ /************************* Forward Declarations *******************************/
struct ahc_platform_data; struct ahc_platform_data;
struct scb_platform_data; struct scb_platform_data;
struct seeprom_descriptor;
/****************************** Useful Macros *********************************/ /****************************** Useful Macros *********************************/
#ifndef MAX #ifndef MAX
...@@ -97,6 +98,14 @@ struct scb_platform_data; ...@@ -97,6 +98,14 @@ struct scb_platform_data;
(SCB_GET_TARGET(ahc, scb) + (SCB_IS_SCSIBUS_B(ahc, scb) ? 8 : 0)) (SCB_GET_TARGET(ahc, scb) + (SCB_IS_SCSIBUS_B(ahc, scb) ? 8 : 0))
#define SCB_GET_TARGET_MASK(ahc, scb) \ #define SCB_GET_TARGET_MASK(ahc, scb) \
(0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb))) (0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb)))
#ifdef AHC_DEBUG
#define SCB_IS_SILENT(scb) \
((ahc_debug & AHC_SHOW_MASKED_ERRORS) == 0 \
&& (((scb)->flags & SCB_SILENT) != 0))
#else
#define SCB_IS_SILENT(scb) \
(((scb)->flags & SCB_SILENT) != 0)
#endif
#define TCL_TARGET_OFFSET(tcl) \ #define TCL_TARGET_OFFSET(tcl) \
((((tcl) >> 4) & TID) >> 4) ((((tcl) >> 4) & TID) >> 4)
#define TCL_LUN(tcl) \ #define TCL_LUN(tcl) \
...@@ -170,7 +179,7 @@ struct scb_platform_data; ...@@ -170,7 +179,7 @@ struct scb_platform_data;
#define AHC_TMODE_CMDS 256 #define AHC_TMODE_CMDS 256
/* Reset line assertion time in us */ /* Reset line assertion time in us */
#define AHC_BUSRESET_DELAY 250 #define AHC_BUSRESET_DELAY 25
/******************* Chip Characteristics/Operating Settings *****************/ /******************* Chip Characteristics/Operating Settings *****************/
/* /*
...@@ -350,9 +359,11 @@ typedef enum { ...@@ -350,9 +359,11 @@ typedef enum {
*/ */
AHC_BIOS_ENABLED = 0x80000, AHC_BIOS_ENABLED = 0x80000,
AHC_ALL_INTERRUPTS = 0x100000, AHC_ALL_INTERRUPTS = 0x100000,
AHC_PAGESCBS = 0x400000, /* Enable SCB paging */ AHC_PAGESCBS = 0x400000, /* Enable SCB paging */
AHC_EDGE_INTERRUPT = 0x800000, /* Device uses edge triggered ints */ AHC_EDGE_INTERRUPT = 0x800000, /* Device uses edge triggered ints */
AHC_39BIT_ADDRESSING = 0x1000000 /* Use 39 bit addressing scheme. */ AHC_39BIT_ADDRESSING = 0x1000000, /* Use 39 bit addressing scheme. */
AHC_LSCBS_ENABLED = 0x2000000, /* 64Byte SCBs enabled */
AHC_SCB_CONFIG_USED = 0x4000000 /* No SEEPROM but SCB2 had info. */
} ahc_flag; } ahc_flag;
/************************* Hardware SCB Definition ***************************/ /************************* Hardware SCB Definition ***************************/
...@@ -531,10 +542,27 @@ typedef enum { ...@@ -531,10 +542,27 @@ typedef enum {
SCB_RECOVERY_SCB = 0x0020, SCB_RECOVERY_SCB = 0x0020,
SCB_AUTO_NEGOTIATE = 0x0040,/* Negotiate to achieve goal. */ SCB_AUTO_NEGOTIATE = 0x0040,/* Negotiate to achieve goal. */
SCB_NEGOTIATE = 0x0080,/* Negotiation forced for command. */ SCB_NEGOTIATE = 0x0080,/* Negotiation forced for command. */
SCB_ABORT = 0x1000, SCB_ABORT = 0x0100,
SCB_UNTAGGEDQ = 0x2000, SCB_UNTAGGEDQ = 0x0200,
SCB_ACTIVE = 0x4000, SCB_ACTIVE = 0x0400,
SCB_TARGET_IMMEDIATE = 0x8000 SCB_TARGET_IMMEDIATE = 0x0800,
SCB_TRANSMISSION_ERROR = 0x1000,/*
* We detected a parity or CRC
* error that has effected the
* payload of the command. This
* flag is checked when normal
* status is returned to catch
* the case of a target not
* responding to our attempt
* to report the error.
*/
SCB_TARGET_SCB = 0x2000,
SCB_SILENT = 0x4000 /*
* Be quiet about transmission type
* errors. They are expected and we
* don't want to upset the user. This
* flag is typically used during DV.
*/
} scb_flag; } scb_flag;
struct scb { struct scb {
...@@ -659,6 +687,11 @@ struct ahc_tmode_lstate; ...@@ -659,6 +687,11 @@ struct ahc_tmode_lstate;
#define AHC_TRANS_GOAL 0x04 /* Modify negotiation goal */ #define AHC_TRANS_GOAL 0x04 /* Modify negotiation goal */
#define AHC_TRANS_USER 0x08 /* Modify user negotiation settings */ #define AHC_TRANS_USER 0x08 /* Modify user negotiation settings */
#define AHC_WIDTH_UNKNOWN 0xFF
#define AHC_PERIOD_UNKNOWN 0xFF
#define AHC_OFFSET_UNKNOWN 0x0
#define AHC_PPR_OPTS_UNKNOWN 0xFF
/* /*
* Transfer Negotiation Information. * Transfer Negotiation Information.
*/ */
...@@ -713,10 +746,9 @@ struct ahc_syncrate { ...@@ -713,10 +746,9 @@ struct ahc_syncrate {
char *rate; char *rate;
}; };
/* /* Safe and valid period for async negotiations. */
* The synchronouse transfer rate table. #define AHC_ASYNC_XFER_PERIOD 0x45
*/ #define AHC_ULTRA2_XFER_PERIOD 0x0a
extern struct ahc_syncrate ahc_syncrates[];
/* /*
* Indexes into our table of syncronous transfer rates. * Indexes into our table of syncronous transfer rates.
...@@ -725,6 +757,7 @@ extern struct ahc_syncrate ahc_syncrates[]; ...@@ -725,6 +757,7 @@ extern struct ahc_syncrate ahc_syncrates[];
#define AHC_SYNCRATE_ULTRA2 1 #define AHC_SYNCRATE_ULTRA2 1
#define AHC_SYNCRATE_ULTRA 3 #define AHC_SYNCRATE_ULTRA 3
#define AHC_SYNCRATE_FAST 6 #define AHC_SYNCRATE_FAST 6
#define AHC_SYNCRATE_MAX AHC_SYNCRATE_DT
/***************************** Lookup Tables **********************************/ /***************************** Lookup Tables **********************************/
/* /*
...@@ -799,7 +832,7 @@ struct seeprom_config { ...@@ -799,7 +832,7 @@ struct seeprom_config {
#define CFSEAUTOTERM 0x0400 /* Ultra2 Perform secondary Auto Term*/ #define CFSEAUTOTERM 0x0400 /* Ultra2 Perform secondary Auto Term*/
#define CFSELOWTERM 0x0800 /* Ultra2 secondary low term */ #define CFSELOWTERM 0x0800 /* Ultra2 secondary low term */
#define CFSEHIGHTERM 0x1000 /* Ultra2 secondary high term */ #define CFSEHIGHTERM 0x1000 /* Ultra2 secondary high term */
#define CFDOMAINVAL 0x4000 /* Perform Domain Validation*/ #define CFENABLEDV 0x4000 /* Perform Domain Validation*/
/* /*
* Bus Release Time, Host Adapter ID * Bus Release Time, Host Adapter ID
...@@ -866,6 +899,7 @@ struct ahc_suspend_state { ...@@ -866,6 +899,7 @@ struct ahc_suspend_state {
}; };
typedef void (*ahc_bus_intr_t)(struct ahc_softc *); typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
typedef void ahc_callback_t (void *);
struct ahc_softc { struct ahc_softc {
bus_space_tag_t tag; bus_space_tag_t tag;
...@@ -941,6 +975,7 @@ struct ahc_softc { ...@@ -941,6 +975,7 @@ struct ahc_softc {
ahc_feature features; ahc_feature features;
ahc_bug bugs; ahc_bug bugs;
ahc_flag flags; ahc_flag flags;
struct seeprom_config *seep_config;
/* Values to store in the SEQCTL register for pause and unpause */ /* Values to store in the SEQCTL register for pause and unpause */
uint8_t unpause; uint8_t unpause;
...@@ -1017,6 +1052,9 @@ struct ahc_softc { ...@@ -1017,6 +1052,9 @@ struct ahc_softc {
/* PCI cacheline size. */ /* PCI cacheline size. */
u_int pci_cachesize; u_int pci_cachesize;
u_int stack_size;
uint16_t *saved_stack;
/* Per-Unit descriptive information */ /* Per-Unit descriptive information */
const char *description; const char *description;
char *name; char *name;
...@@ -1089,11 +1127,13 @@ void ahc_busy_tcl(struct ahc_softc *ahc, ...@@ -1089,11 +1127,13 @@ void ahc_busy_tcl(struct ahc_softc *ahc,
struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t); struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
int ahc_pci_config(struct ahc_softc *, int ahc_pci_config(struct ahc_softc *,
struct ahc_pci_identity *); struct ahc_pci_identity *);
int ahc_pci_test_register_access(struct ahc_softc *);
/*************************** EISA/VL Front End ********************************/ /*************************** EISA/VL Front End ********************************/
struct aic7770_identity *aic7770_find_device(uint32_t); struct aic7770_identity *aic7770_find_device(uint32_t);
int aic7770_config(struct ahc_softc *ahc, int aic7770_config(struct ahc_softc *ahc,
struct aic7770_identity *); struct aic7770_identity *,
u_int port);
/************************** SCB and SCB queue management **********************/ /************************** SCB and SCB queue management **********************/
int ahc_probe_scbs(struct ahc_softc *); int ahc_probe_scbs(struct ahc_softc *);
...@@ -1116,6 +1156,7 @@ void ahc_pause_and_flushwork(struct ahc_softc *ahc); ...@@ -1116,6 +1156,7 @@ void ahc_pause_and_flushwork(struct ahc_softc *ahc);
int ahc_suspend(struct ahc_softc *ahc); int ahc_suspend(struct ahc_softc *ahc);
int ahc_resume(struct ahc_softc *ahc); int ahc_resume(struct ahc_softc *ahc);
void ahc_softc_insert(struct ahc_softc *); void ahc_softc_insert(struct ahc_softc *);
struct ahc_softc *ahc_find_softc(struct ahc_softc *ahc);
void ahc_set_unit(struct ahc_softc *, int); void ahc_set_unit(struct ahc_softc *, int);
void ahc_set_name(struct ahc_softc *, char *); void ahc_set_name(struct ahc_softc *, char *);
void ahc_alloc_scbs(struct ahc_softc *ahc); void ahc_alloc_scbs(struct ahc_softc *ahc);
...@@ -1146,6 +1187,11 @@ int ahc_search_qinfifo(struct ahc_softc *ahc, int target, ...@@ -1146,6 +1187,11 @@ int ahc_search_qinfifo(struct ahc_softc *ahc, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status, role_t role, uint32_t status,
ahc_search_action action); ahc_search_action action);
int ahc_search_untagged_queues(struct ahc_softc *ahc,
ahc_io_ctx_t ctx,
int target, char channel,
int lun, uint32_t status,
ahc_search_action action);
int ahc_search_disc_list(struct ahc_softc *ahc, int target, int ahc_search_disc_list(struct ahc_softc *ahc, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
int stop_on_first, int remove, int stop_on_first, int remove,
...@@ -1157,7 +1203,8 @@ int ahc_abort_scbs(struct ahc_softc *ahc, int target, ...@@ -1157,7 +1203,8 @@ int ahc_abort_scbs(struct ahc_softc *ahc, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status); role_t role, uint32_t status);
void ahc_restart(struct ahc_softc *ahc); void ahc_restart(struct ahc_softc *ahc);
void ahc_calc_residual(struct scb *scb); void ahc_calc_residual(struct ahc_softc *ahc,
struct scb *scb);
/*************************** Utility Functions ********************************/ /*************************** Utility Functions ********************************/
struct ahc_phase_table_entry* struct ahc_phase_table_entry*
ahc_lookup_phase_entry(int phase); ahc_lookup_phase_entry(int phase);
...@@ -1179,11 +1226,20 @@ void ahc_validate_width(struct ahc_softc *ahc, ...@@ -1179,11 +1226,20 @@ void ahc_validate_width(struct ahc_softc *ahc,
struct ahc_initiator_tinfo *tinfo, struct ahc_initiator_tinfo *tinfo,
u_int *bus_width, u_int *bus_width,
role_t role); role_t role);
/*
* Negotiation types. These are used to qualify if we should renegotiate
* even if our goal and current transport parameters are identical.
*/
typedef enum {
AHC_NEG_TO_GOAL, /* Renegotiate only if goal and curr differ. */
AHC_NEG_IF_NON_ASYNC, /* Renegotiate so long as goal is non-async. */
AHC_NEG_ALWAYS /* Renegotiat even if goal is async. */
} ahc_neg_type;
int ahc_update_neg_request(struct ahc_softc*, int ahc_update_neg_request(struct ahc_softc*,
struct ahc_devinfo*, struct ahc_devinfo*,
struct ahc_tmode_tstate*, struct ahc_tmode_tstate*,
struct ahc_initiator_tinfo*, struct ahc_initiator_tinfo*,
int /*force*/); ahc_neg_type);
void ahc_set_width(struct ahc_softc *ahc, void ahc_set_width(struct ahc_softc *ahc,
struct ahc_devinfo *devinfo, struct ahc_devinfo *devinfo,
u_int width, u_int type, int paused); u_int width, u_int type, int paused);
...@@ -1219,6 +1275,35 @@ cam_status ahc_find_tmode_devs(struct ahc_softc *ahc, ...@@ -1219,6 +1275,35 @@ cam_status ahc_find_tmode_devs(struct ahc_softc *ahc,
#endif #endif
#endif #endif
/******************************* Debug ***************************************/ /******************************* Debug ***************************************/
#ifdef AHC_DEBUG
extern uint32_t ahc_debug;
#define AHC_SHOW_MISC 0x0001
#define AHC_SHOW_SENSE 0x0002
#define AHC_DUMP_SEEPROM 0x0004
#define AHC_SHOW_TERMCTL 0x0008
#define AHC_SHOW_MEMORY 0x0010
#define AHC_SHOW_MESSAGES 0x0020
#define AHC_SHOW_DV 0x0040
#define AHC_SHOW_SELTO 0x0080
#define AHC_SHOW_QFULL 0x0200
#define AHC_SHOW_QUEUE 0x0400
#define AHC_SHOW_TQIN 0x0800
#define AHC_SHOW_MASKED_ERRORS 0x1000
#define AHC_DEBUG_SEQUENCER 0x2000
#endif
void ahc_print_scb(struct scb *scb); void ahc_print_scb(struct scb *scb);
void ahc_print_devinfo(struct ahc_softc *ahc,
struct ahc_devinfo *dev);
void ahc_dump_card_state(struct ahc_softc *ahc); void ahc_dump_card_state(struct ahc_softc *ahc);
int ahc_print_register(ahc_reg_parse_entry_t *table,
u_int num_entries,
const char *name,
u_int address,
u_int value,
u_int *cur_column,
u_int wrap_point);
/******************************* SEEPROM *************************************/
int ahc_acquire_seeprom(struct ahc_softc *ahc,
struct seeprom_descriptor *sd);
void ahc_release_seeprom(struct seeprom_descriptor *sd);
#endif /* _AIC7XXX_H_ */ #endif /* _AIC7XXX_H_ */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -38,9 +38,9 @@ ...@@ -38,9 +38,9 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.h#7 $ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.h#12 $
* *
* $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_93cx6.h,v 1.8 2000/11/10 20:13:41 gibbs Exp $ * $FreeBSD$
*/ */
#ifndef _AIC7XXX_93CX6_H_ #ifndef _AIC7XXX_93CX6_H_
#define _AIC7XXX_93CX6_H_ #define _AIC7XXX_93CX6_H_
...@@ -93,8 +93,10 @@ do { \ ...@@ -93,8 +93,10 @@ do { \
#define SEEPROM_DATA_INB(sd) \ #define SEEPROM_DATA_INB(sd) \
ahc_inb(sd->sd_ahc, sd->sd_dataout_offset) ahc_inb(sd->sd_ahc, sd->sd_dataout_offset)
int read_seeprom(struct seeprom_descriptor *sd, uint16_t *buf, int ahc_read_seeprom(struct seeprom_descriptor *sd, uint16_t *buf,
u_int start_addr, u_int count); u_int start_addr, u_int count);
int verify_cksum(struct seeprom_config *sc); int ahc_write_seeprom(struct seeprom_descriptor *sd, uint16_t *buf,
u_int start_addr, u_int count);
int ahc_verify_cksum(struct seeprom_config *sc);
#endif /* _AIC7XXX_93CX6_H_ */ #endif /* _AIC7XXX_93CX6_H_ */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
PROG= aicasm PROG= aicasm
.SUFFIXES= .l .y .c .SUFFIXES= .l .y .c .h
CSRCS= aicasm.c aicasm_symbol.c CSRCS= aicasm.c aicasm_symbol.c
GENSRCS= aicasm_gram.c aicasm_scan.c YSRCS= aicasm_gram.y aicasm_macro_gram.y
GENHDRS= y.tab.h aicdb.h LSRCS= aicasm_scan.l aicasm_macro_scan.l
SRCS= ${GENSRCS} ${CSRCS} GENHDRS= aicdb.h $(YSRCS:.y=.h)
GENSRCS= $(YSRCS:.y=.c) $(LSRCS:.l=.c)
# Cleaned up by make clean SRCS= ${CSRCS} ${GENSRCS}
clean-files := $(GENSRCS) $(GENHDRS) y.output $(PROG) CLEANFILES= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output)
# Override default kernel CFLAGS. This is a userland app. # Override default kernel CFLAGS. This is a userland app.
AICASM_CFLAGS:= -I/usr/include -I. -ldb AICASM_CFLAGS:= -I/usr/include -I. -ldb
YFLAGS= -d YFLAGS= -d
...@@ -28,7 +29,7 @@ YFLAGS+= -t -v ...@@ -28,7 +29,7 @@ YFLAGS+= -t -v
LFLAGS= -d LFLAGS= -d
endif endif
$(PROG): $(SRCS) $(GENHDRS) $(PROG): ${GENHDRS} $(SRCS)
$(AICASM_CC) $(AICASM_CFLAGS) $(SRCS) -o $(PROG) $(AICASM_CC) $(AICASM_CFLAGS) $(SRCS) -o $(PROG)
aicdb.h: aicdb.h:
...@@ -44,8 +45,21 @@ aicdb.h: ...@@ -44,8 +45,21 @@ aicdb.h:
echo "*** Install db development libraries"; \ echo "*** Install db development libraries"; \
fi fi
y.tab.h aicasm_gram.c: aicasm_gram.y clean:
$(YACC) $(YFLAGS) aicasm_gram.y rm -f $(CLEANFILES) $(PROG)
mv y.tab.c aicasm_gram.c
aicasm_scan.c: y.tab.h aicasm_gram.c aicasm_gram.h: aicasm_gram.y
$(YACC) $(YFLAGS) -b $(<:.y=) $<
mv $(<:.y=).tab.c $(<:.y=.c)
mv $(<:.y=).tab.h $(<:.y=.h)
aicasm_macro_gram.c aicasm_macro_gram.h: aicasm_macro_gram.y
$(YACC) $(YFLAGS) -b $(<:.y=) -p mm $<
mv $(<:.y=).tab.c $(<:.y=.c)
mv $(<:.y=).tab.h $(<:.y=.h)
aicasm_scan.c: aicasm_scan.l
$(LEX) $(LFLAGS) -o$@ $<
aicasm_macro_scan.c: aicasm_macro_scan.l
$(LEX) $(LFLAGS) -Pmm -o$@ $<
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -37,9 +37,9 @@ ...@@ -37,9 +37,9 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#7 $ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#11 $
* *
* $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_insformat.h,v 1.3 2000/09/22 22:19:54 gibbs Exp $ * $FreeBSD$
*/ */
struct ins_format1 { struct ins_format1 {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment