Add a driver for the Tekram DC-395U/UW/F and DC-315/U SCSI host adapters,
which have the Tekram TRM-S1040 ASIC. This driver is written by Rui-Xiang Guo <rxg@ms25.url.com.tw>, and a number of cosmetic changes by me. Tested on i386 by the author, and on macppc and sparc64 by me. XXX On arc, kernel got panic in ltsleep() called from scsipi_execute_xs(), XXX but I'm not sure what is wrong...
This commit is contained in:
parent
f82eb7bfa1
commit
d3701fc18a
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: files.pci,v 1.142 2001/10/17 18:39:41 jdolecek Exp $
|
||||
# $NetBSD: files.pci,v 1.143 2001/11/03 17:01:16 tsutsui Exp $
|
||||
#
|
||||
# Config file and device description for machine-independent PCI code.
|
||||
# Included by ports that need it. Requires that the SCSI files be
|
||||
|
@ -145,6 +145,11 @@ file dev/pci/siop_pci.c siop_pci
|
|||
attach iha at pci with iha_pci
|
||||
file dev/pci/iha_pci.c iha_pci
|
||||
|
||||
# Tekram DC-395U/UW/F and DC-315/U SCSI controllers
|
||||
device trm: scsi
|
||||
attach trm at pci
|
||||
file dev/pci/trm.c trm
|
||||
|
||||
# PCI IDE controllers
|
||||
device pciide {[channel = -1]}: cy82c693, wdc_base, ata, atapi
|
||||
attach pciide at pci
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,308 @@
|
|||
/* $NetBSD: trmreg.h,v 1.1 2001/11/03 17:01:18 tsutsui Exp $ */
|
||||
/*
|
||||
* Device Driver for Tekram DC395U/UW/F, DC315/U
|
||||
* PCI SCSI Bus Master Host Adapter
|
||||
* (SCSI chip set used Tekram ASIC TRM-S1040)
|
||||
*
|
||||
* Copyright (c) 2001 Rui-Xiang Guo
|
||||
* 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.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, 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 DAMAGE.
|
||||
*/
|
||||
/*
|
||||
* Ported from
|
||||
* dc395x_trm.h
|
||||
*
|
||||
* Written for NetBSD 1.4.x by
|
||||
* Erich Chen (erich@tekram.com.tw)
|
||||
*
|
||||
* Provided by
|
||||
* (C)Copyright 1995-1999 Tekram Technology Co., Ltd. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* The SCSI register offset for TRM_S1040
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#define TRM_SCSI_STATUS 0x80 /* SCSI Status (R) */
|
||||
#define COMMANDPHASEDONE 0x2000 /* SCSI command phase done */
|
||||
#define SCSIXFERDONE 0x0800 /* SCSI transfer done */
|
||||
#define SCSIXFERCNT_2_ZERO 0x0100 /* SCSI transfer count to zero */
|
||||
#define SCSIINTERRUPT 0x0080 /* SCSI interrupt pending */
|
||||
#define COMMANDABORT 0x0040 /* SCSI command abort */
|
||||
#define SEQUENCERACTIVE 0x0020 /* SCSI sequencer active */
|
||||
#define PHASEMISMATCH 0x0010 /* SCSI phase mismatch */
|
||||
#define PARITYERROR 0x0008 /* SCSI parity error */
|
||||
#define PHASEMASK 0x0007 /* Phase MSG/CD/IO */
|
||||
#define PH_DATA_OUT 0x00 /* Data out phase */
|
||||
#define PH_DATA_IN 0x01 /* Data in phase */
|
||||
#define PH_COMMAND 0x02 /* Command phase */
|
||||
#define PH_STATUS 0x03 /* Status phase */
|
||||
#define PH_BUS_FREE 0x05 /* Invalid phase as bus free */
|
||||
#define PH_MSG_OUT 0x06 /* Message out phase */
|
||||
#define PH_MSG_IN 0x07 /* Message in phase */
|
||||
#define TRM_SCSI_CONTROL 0x80 /* SCSI Control (W) */
|
||||
#define DO_CLRATN 0x0400 /* Clear ATN */
|
||||
#define DO_SETATN 0x0200 /* Set ATN */
|
||||
#define DO_CMDABORT 0x0100 /* Abort SCSI command */
|
||||
#define DO_RSTMODULE 0x0010 /* Reset SCSI chip */
|
||||
#define DO_RSTSCSI 0x0008 /* Reset SCSI bus */
|
||||
#define DO_CLRFIFO 0x0004 /* Clear SCSI transfer FIFO */
|
||||
#define DO_DATALATCH 0x0002 /* Enable SCSI bus data latch */
|
||||
#define DO_HWRESELECT 0x0001 /* Enable hardware reselection */
|
||||
#define TRM_SCSI_FIFOCNT 0x82 /* SCSI FIFO Counter (R) */
|
||||
#define SCSI_FIFOCNT_MASK 0x1F /* 5 bits SCSI FIFO counter */
|
||||
#define SCSI_FIFO_EMPTY 0x40 /* SCSI FIFO Empty */
|
||||
#define TRM_SCSI_SIGNAL 0x83 /* SCSI low level signal (R/W) */
|
||||
#define TRM_SCSI_INTSTATUS 0x84 /* SCSI Interrupt Status (R) */
|
||||
#define INT_SCAM 0x80 /* SCAM selection interrupt */
|
||||
#define INT_SELECT 0x40 /* Selection interrupt */
|
||||
#define INT_SELTIMEOUT 0x20 /* Selection timeout interrupt */
|
||||
#define INT_DISCONNECT 0x10 /* Bus disconnected interrupt */
|
||||
#define INT_RESELECTED 0x08 /* Reselected interrupt */
|
||||
#define INT_SCSIRESET 0x04 /* SCSI reset detected interrupt */
|
||||
#define INT_BUSSERVICE 0x02 /* Bus service interrupt */
|
||||
#define INT_CMDDONE 0x01 /* SCSI command done interrupt */
|
||||
#define TRM_SCSI_OFFSET 0x84 /* SCSI Offset Count (W) */
|
||||
/*
|
||||
* Bit Name Definition
|
||||
* 07-05 0 RSVD Reversed. Always 0.
|
||||
* 04 0 OFFSET4 Reversed for LVDS. Always 0.
|
||||
* 03-00 0 OFFSET[03:00] Offset number from 0 to 15
|
||||
*/
|
||||
#define TRM_SCSI_SYNC 0x85 /* SCSI Sync Control (R/W) */
|
||||
#define LVDS_SYNC 0x20 /* Enable LVDS sync */
|
||||
#define WIDE_SYNC 0x10 /* Enable WIDE sync */
|
||||
#define ALT_SYNC 0x08 /* Enable Fast-20 alternate sync */
|
||||
/*
|
||||
* SYNCM 7 6 5 4 3 2 1 0
|
||||
* Name RSVD RSVD LVDS WIDE ALTPERD PERIOD2 PERIOD1 PERIOD0
|
||||
* Default 0 0 0 0 0 0 0 0
|
||||
*
|
||||
* Bit Name Definition
|
||||
* 07-06 0 RSVD Reversed. Always read 0
|
||||
* 05 0 LVDS Reversed. Always read 0
|
||||
* 04 0 WIDE/WSCSI Enable wide (16-bits) SCSI transfer.
|
||||
* 03 0 ALTPERD/ALTPD Alternate (Sync./Period) mode.
|
||||
*
|
||||
* @@ When this bit is set,
|
||||
* the synchronous period bits 2:0
|
||||
* in the Synchronous Mode register
|
||||
* are used to transfer data
|
||||
* at the Fast-20 rate.
|
||||
* @@ When this bit is reset,
|
||||
* the synchronous period bits 2:0
|
||||
* in the Synchronous Mode Register
|
||||
* are used to transfer data
|
||||
* at the Fast-40 rate.
|
||||
*
|
||||
* 02-00 0 PERIOD[2:0]/SXPD[02:00] Synchronous SCSI Transfer Rate.
|
||||
* These 3 bits specify
|
||||
* the Synchronous SCSI Transfer Rate
|
||||
* for Fast-20 and Fast-10.
|
||||
* These bits are also reset
|
||||
* by a SCSI Bus reset.
|
||||
*
|
||||
* For Fast-10 bit ALTPD = 0 and LVDS = 0
|
||||
* and bit2,bit1,bit0 is defined as follows :
|
||||
*
|
||||
* 000 100ns, 10.0 Mbytes/s
|
||||
* 001 150ns, 6.6 Mbytes/s
|
||||
* 010 200ns, 5.0 Mbytes/s
|
||||
* 011 250ns, 4.0 Mbytes/s
|
||||
* 100 300ns, 3.3 Mbytes/s
|
||||
* 101 350ns, 2.8 Mbytes/s
|
||||
* 110 400ns, 2.5 Mbytes/s
|
||||
* 111 450ns, 2.2 Mbytes/s
|
||||
*
|
||||
* For Fast-20 bit ALTPD = 1 and LVDS = 0
|
||||
* and bit2,bit1,bit0 is defined as follows :
|
||||
*
|
||||
* 000 50ns, 20.0 Mbytes/s
|
||||
* 001 75ns, 13.3 Mbytes/s
|
||||
* 010 100ns, 10.0 Mbytes/s
|
||||
* 011 125ns, 8.0 Mbytes/s
|
||||
* 100 150ns, 6.6 Mbytes/s
|
||||
* 101 175ns, 5.7 Mbytes/s
|
||||
* 110 200ns, 5.0 Mbytes/s
|
||||
* 111 250ns, 4.0 Mbytes/s
|
||||
*
|
||||
* For Fast-40 bit ALTPD = 0 and LVDS = 1
|
||||
* and bit2,bit1,bit0 is defined as follows :
|
||||
*
|
||||
* 000 25ns, 40.0 Mbytes/s
|
||||
* 001 50ns, 20.0 Mbytes/s
|
||||
* 010 75ns, 13.3 Mbytes/s
|
||||
* 011 100ns, 10.0 Mbytes/s
|
||||
* 100 125ns, 8.0 Mbytes/s
|
||||
* 101 150ns, 6.6 Mbytes/s
|
||||
* 110 175ns, 5.7 Mbytes/s
|
||||
* 111 200ns, 5.0 Mbytes/s
|
||||
*/
|
||||
#define TRM_SCSI_TARGETID 0x86 /* SCSI Target ID (R/W) */
|
||||
#define TRM_SCSI_IDMSG 0x87 /* SCSI Identify Message (R) */
|
||||
#define TRM_SCSI_HOSTID 0x87 /* SCSI Host ID (W) */
|
||||
#define TRM_SCSI_XCNT 0x88 /* SCSI Transfer Counter (R/W) */
|
||||
#define SCSI_XCNT_MASK 0x00FFFFFF /* 24 bits SCSI transfer counter */
|
||||
#define TRM_SCSI_INTEN 0x8C /* SCSI Interrupt Enable (R/W) */
|
||||
#define EN_SCAM 0x80 /* Enable SCAM selection intr */
|
||||
#define EN_SELECT 0x40 /* Enable selection intr */
|
||||
#define EN_SELTIMEOUT 0x20 /* Enable selection timeout intr */
|
||||
#define EN_DISCONNECT 0x10 /* Enable bus disconnected intr */
|
||||
#define EN_RESELECTED 0x08 /* Enable reselected intr */
|
||||
#define EN_SCSIRESET 0x04 /* Enable SCSI reset detected intr */
|
||||
#define EN_BUSSERVICE 0x02 /* Enable bus service intr */
|
||||
#define EN_CMDDONE 0x01 /* Enable SCSI command done intr */
|
||||
#define TRM_SCSI_CONFIG0 0x8D /* SCSI Configuration 0 (R/W) */
|
||||
#define PHASELATCH 0x40 /* Enable phase latch */
|
||||
#define INITIATOR 0x20 /* Enable initiator mode */
|
||||
#define PARITYCHECK 0x10 /* Enable parity check */
|
||||
#define BLOCKRST 0x01 /* Disable SCSI reset */
|
||||
#define TRM_SCSI_CONFIG1 0x8E /* SCSI Configuration 1 (R/W) */
|
||||
#define ACTIVE_NEGPLUS 0x10 /* Enhance active negation */
|
||||
#define FILTER_DISABLE 0x08 /* Disable SCSI data filter */
|
||||
#define ACTIVE_NEG 0x02 /* Enable active negation */
|
||||
#define TRM_SCSI_COMMAND 0x90 /* SCSI Command (R/W) */
|
||||
#define SCMD_COMP 0x12 /* Command complete */
|
||||
#define SCMD_SEL_ATN 0x60 /* Selection with ATN */
|
||||
#define SCMD_SEL_ATN3 0x64 /* Selection with ATN3 */
|
||||
#define SCMD_SEL_ATNSTOP 0xB8 /* Selection with ATN and Stop */
|
||||
#define SCMD_FIFO_OUT 0xC0 /* SCSI FIFO transfer out */
|
||||
#define SCMD_DMA_OUT 0xC1 /* SCSI DMA transfer out */
|
||||
#define SCMD_FIFO_IN 0xC2 /* SCSI FIFO transfer in */
|
||||
#define SCMD_DMA_IN 0xC3 /* SCSI DMA transfer in */
|
||||
#define SCMD_MSGACCEPT 0xD8 /* Message accept */
|
||||
/*
|
||||
* Code Command Description
|
||||
*
|
||||
* 02 Enable reselection with FIFO
|
||||
* 40 Select without ATN with FIFO
|
||||
* 60 Select with ATN with FIFO
|
||||
* 64 Select with ATN3 with FIFO
|
||||
* A0 Select with ATN and stop with FIFO
|
||||
* C0 Transfer information out with FIFO
|
||||
* C1 Transfer information out with DMA
|
||||
* C2 Transfer information in with FIFO
|
||||
* C3 Transfer information in with DMA
|
||||
* 12 Initiator command complete with FIFO
|
||||
* 50 Initiator transfer information out sequence without ATN with FIFO
|
||||
* 70 Initiator transfer information out sequence with ATN with FIFO
|
||||
* 74 Initiator transfer information out sequence with ATN3 with FIFO
|
||||
* 52 Initiator transfer information in sequence without ATN with FIFO
|
||||
* 72 Initiator transfer information in sequence with ATN with FIFO
|
||||
* 76 Initiator transfer information in sequence with ATN3 with FIFO
|
||||
* 90 Initiator transfer information out command complete with FIFO
|
||||
* 92 Initiator transfer information in command complete with FIFO
|
||||
* D2 Enable selection
|
||||
* 08 Reselection
|
||||
* 48 Disconnect command with FIFO
|
||||
* 88 Terminate command with FIFO
|
||||
* C8 Target command complete with FIFO
|
||||
* 18 SCAM Arbitration/ Selection
|
||||
* 5A Enable reselection
|
||||
* 98 Select without ATN with FIFO
|
||||
* B8 Select with ATN with FIFO
|
||||
* D8 Message Accepted
|
||||
* 58 NOP
|
||||
*/
|
||||
#define TRM_SCSI_TIMEOUT 0x91 /* SCSI Time Out Value (R/W) */
|
||||
#define SEL_TIMEOUT 153 /* 250ms selection timeout (@ 40 MHz) */
|
||||
#define TRM_SCSI_FIFO 0x98 /* SCSI FIFO (R/W) */
|
||||
#define TRM_SCSI_TCR0 0x9C /* SCSI Target Control 0 (R/W) */
|
||||
#define TCR0_WIDE_NEGO_DONE 0x8000 /* Wide nego done */
|
||||
#define TCR0_SYNC_NEGO_DONE 0x4000 /* Sync nego done */
|
||||
#define TCR0_ENABLE_LVDS 0x2000 /* Enable LVDS sync */
|
||||
#define TCR0_ENABLE_WIDE 0x1000 /* Enable WIDE sync */
|
||||
#define TCR0_ENABLE_ALT 0x0800 /* Enable alternate sync */
|
||||
#define TCR0_PERIOD_MASK 0x0700 /* Transfer rate */
|
||||
#define TCR0_DO_WIDE_NEGO 0x0080 /* Do wide NEGO */
|
||||
#define TCR0_DO_SYNC_NEGO 0x0040 /* Do sync NEGO */
|
||||
#define TCR0_DISCONNECT_EN 0x0020 /* Disconnection enable */
|
||||
#define TCR0_OFFSET_MASK 0x001F /* Offset number */
|
||||
#define TRM_SCSI_TCR1 0x9E /* SCSI Target Control 1 (R/W) */
|
||||
#define MAXTAG_MASK 0x7F00 /* Maximum tags (127) */
|
||||
#define NON_TAG_BUSY 0x0080 /* Non tag command active */
|
||||
#define ACTTAG_MASK 0x007F /* Active tags */
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* The DMA register offset for TRM_S1040
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#define TRM_DMA_COMMAND 0xA0 /* DMA Command (R/W) */
|
||||
#define SGXFER 0x02 /* Scatter/Gather transfer */
|
||||
#define XFERDATAIN 0x01 /* Transfer data in */
|
||||
#define XFERDATAOUT 0x00 /* Transfer data out */
|
||||
#define TRM_DMA_CONTROL 0xA1 /* DMA Control (W) */
|
||||
#define STOPDMAXFER 0x08 /* Stop DMA transfer */
|
||||
#define ABORTXFER 0x04 /* Abort DMA transfer */
|
||||
#define CLRXFIFO 0x02 /* Clear DMA transfer FIFO */
|
||||
#define STARTDMAXFER 0x01 /* Start DMA transfer */
|
||||
#define TRM_DMA_FIFOCNT 0xA1 /* DMA FIFO Counter (R) */
|
||||
#define DMA_FIFOCNT_MASK 0xFF /* Data FIFO Count */
|
||||
#define TRM_DMA_FIFOSTATUS 0xA2 /* DMA FIFO Status (R) */
|
||||
#define DMA_FIFO_EMPTY 0x80 /* DMA FIFO Empty */
|
||||
#define DMA_FIFO_FULL 0x01 /* DMA FIFO Full */
|
||||
#define TRM_DMA_STATUS 0xA3 /* DMA Interrupt Status (R/W) */
|
||||
#define XFERPENDING 0x80 /* Transfer pending */
|
||||
#define DMAXFERCOMP 0x02 /* Bus Master XFER Complete status */
|
||||
#define SCSICOMP 0x01 /* SCSI complete interrupt */
|
||||
#define TRM_DMA_INTEN 0xA4 /* DMA Interrupt Enable (R/W) */
|
||||
#define EN_SCSIINTR 0x01 /* Enable SCSI complete interrupt */
|
||||
#define TRM_DMA_CONFIG 0xA6 /* DMA Configuration (R/W) */
|
||||
#define DMA_ENHANCE 0x8000 /* Enable DMA enhance feature */
|
||||
#define TRM_DMA_XCNT 0xA8 /* DMA Transfer Counter (R/W) */
|
||||
#define TRM_DMA_CXCNT 0xAC /* DMA Current Transfer Counter (R) */
|
||||
#define TRM_DMA_XLOWADDR 0xB0 /* DMA Xfer Physical Low Addr (R/W) */
|
||||
#define TRM_DMA_XHIGHADDR 0xB4 /* DMA Xfer Physical High Addr (R/W) */
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* The general register offset for TRM_S1040
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
#define TRM_GEN_CONTROL 0xD4 /* Global Control (R/W) */
|
||||
#define EN_LED 0x80 /* Enable Control onboard LED */
|
||||
#define EN_EEPROM 0x10 /* Enable EEPROM programming */
|
||||
#define AUTOTERM 0x04 /* Enable Auto SCSI terminator */
|
||||
#define LOW8TERM 0x02 /* Enable Lower 8 bit SCSI terminator */
|
||||
#define UP8TERM 0x01 /* Enable Upper 8 bit SCSI terminator */
|
||||
#define TRM_GEN_STATUS 0xD5 /* Global Status (R) */
|
||||
#define GTIMEOUT 0x80 /* Global timer reach 0 */
|
||||
#define CON5068 0x10 /* External 50/68 pin connected */
|
||||
#define CON68 0x08 /* Internal 68 pin connected */
|
||||
#define CON50 0x04 /* Internal 50 pin connected */
|
||||
#define WIDESCSI 0x02 /* Wide SCSI card */
|
||||
#define TRM_GEN_NVRAM 0xD6 /* Serial NON-VOLATILE RAM port (R/W) */
|
||||
#define NVR_BITOUT 0x08 /* Serial data out */
|
||||
#define NVR_BITIN 0x04 /* Serial data in */
|
||||
#define NVR_CLOCK 0x02 /* Serial clock */
|
||||
#define NVR_SELECT 0x01 /* Serial select */
|
||||
#define TRM_GEN_EDATA 0xD7 /* Parallel EEPROM data port (R/W) */
|
||||
#define TRM_GEN_EADDRESS 0xD8 /* Parallel EEPROM address (R/W) */
|
||||
#define TRM_GEN_TIMER 0xDB /* Global timer (R/W) */
|
Loading…
Reference in New Issue