Home | History | Annotate | Line # | Download | only in pci
trm.c revision 1.3
      1  1.3  tsutsui /*	$NetBSD: trm.c,v 1.3 2001/11/11 05:28:55 tsutsui Exp $	*/
      2  1.1  tsutsui /*
      3  1.1  tsutsui  * Device Driver for Tekram DC395U/UW/F, DC315/U
      4  1.1  tsutsui  * PCI SCSI Bus Master Host Adapter
      5  1.1  tsutsui  * (SCSI chip set used Tekram ASIC TRM-S1040)
      6  1.1  tsutsui  *
      7  1.1  tsutsui  * Copyright (c) 2001 Rui-Xiang Guo
      8  1.1  tsutsui  * All rights reserved.
      9  1.1  tsutsui  *
     10  1.1  tsutsui  * Redistribution and use in source and binary forms, with or without
     11  1.1  tsutsui  * modification, are permitted provided that the following conditions
     12  1.1  tsutsui  * are met:
     13  1.1  tsutsui  * 1. Redistributions of source code must retain the above copyright
     14  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer.
     15  1.1  tsutsui  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  tsutsui  *    documentation and/or other materials provided with the distribution.
     18  1.1  tsutsui  * 3. The name of the author may not be used to endorse or promote products
     19  1.1  tsutsui  *    derived from this software without specific prior written permission.
     20  1.1  tsutsui  *
     21  1.1  tsutsui  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22  1.1  tsutsui  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23  1.1  tsutsui  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24  1.1  tsutsui  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25  1.1  tsutsui  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26  1.1  tsutsui  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  1.1  tsutsui  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  1.1  tsutsui  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  1.1  tsutsui  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30  1.1  tsutsui  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  1.1  tsutsui  */
     32  1.1  tsutsui /*
     33  1.1  tsutsui  * Ported from
     34  1.1  tsutsui  *   dc395x_trm.c
     35  1.1  tsutsui  *
     36  1.1  tsutsui  * Written for NetBSD 1.4.x by
     37  1.1  tsutsui  *   Erich Chen     (erich (at) tekram.com.tw)
     38  1.1  tsutsui  *
     39  1.1  tsutsui  * Provided by
     40  1.1  tsutsui  *   (C)Copyright 1995-1999 Tekram Technology Co., Ltd. All rights reserved.
     41  1.1  tsutsui  */
     42  1.1  tsutsui 
     43  1.2  tsutsui /* #define TRM_DEBUG */
     44  1.1  tsutsui 
     45  1.1  tsutsui #include <sys/param.h>
     46  1.1  tsutsui #include <sys/systm.h>
     47  1.1  tsutsui #include <sys/malloc.h>
     48  1.1  tsutsui #include <sys/buf.h>
     49  1.1  tsutsui #include <sys/kernel.h>
     50  1.1  tsutsui #include <sys/device.h>
     51  1.1  tsutsui 
     52  1.1  tsutsui #include <machine/bus.h>
     53  1.1  tsutsui #include <machine/intr.h>
     54  1.1  tsutsui 
     55  1.1  tsutsui #include <uvm/uvm_extern.h>
     56  1.1  tsutsui 
     57  1.1  tsutsui #include <dev/scsipi/scsi_all.h>
     58  1.1  tsutsui #include <dev/scsipi/scsi_message.h>
     59  1.1  tsutsui #include <dev/scsipi/scsipi_all.h>
     60  1.1  tsutsui #include <dev/scsipi/scsiconf.h>
     61  1.1  tsutsui 
     62  1.1  tsutsui #include <dev/pci/pcidevs.h>
     63  1.1  tsutsui #include <dev/pci/pcireg.h>
     64  1.1  tsutsui #include <dev/pci/pcivar.h>
     65  1.1  tsutsui #include <dev/pci/trmreg.h>
     66  1.1  tsutsui 
     67  1.1  tsutsui /*
     68  1.1  tsutsui  * feature of chip set MAX value
     69  1.1  tsutsui  */
     70  1.1  tsutsui #define TRM_MAX_TARGETS		16
     71  1.1  tsutsui #define TRM_MAX_SG_ENTRIES	(MAXPHYS / PAGE_SIZE + 1)
     72  1.1  tsutsui #define TRM_MAX_SRB		32
     73  1.1  tsutsui 
     74  1.1  tsutsui /*
     75  1.1  tsutsui  * Segment Entry
     76  1.1  tsutsui  */
     77  1.1  tsutsui struct trm_sg_entry {
     78  1.1  tsutsui 	u_int32_t address;
     79  1.1  tsutsui 	u_int32_t length;
     80  1.1  tsutsui };
     81  1.1  tsutsui 
     82  1.1  tsutsui #define TRM_SG_SIZE	(sizeof(struct trm_sg_entry) * TRM_MAX_SG_ENTRIES)
     83  1.1  tsutsui 
     84  1.1  tsutsui /*
     85  1.1  tsutsui  **********************************************************************
     86  1.1  tsutsui  * The SEEPROM structure for TRM_S1040
     87  1.1  tsutsui  **********************************************************************
     88  1.1  tsutsui  */
     89  1.1  tsutsui struct nvram_target {
     90  1.1  tsutsui 	u_int8_t config0;		/* Target configuration byte 0 */
     91  1.1  tsutsui #define NTC_DO_WIDE_NEGO	0x20	/* Wide negotiate	     */
     92  1.1  tsutsui #define NTC_DO_TAG_QUEUING	0x10	/* Enable SCSI tag queuing   */
     93  1.1  tsutsui #define NTC_DO_SEND_START	0x08	/* Send start command SPINUP */
     94  1.1  tsutsui #define NTC_DO_DISCONNECT	0x04	/* Enable SCSI disconnect    */
     95  1.1  tsutsui #define NTC_DO_SYNC_NEGO	0x02	/* Sync negotiation	     */
     96  1.1  tsutsui #define NTC_DO_PARITY_CHK	0x01	/* (it should define at NAC) Parity check enable */
     97  1.1  tsutsui 	u_int8_t period;		/* Target period	       */
     98  1.1  tsutsui 	u_int8_t config2;		/* Target configuration byte 2 */
     99  1.1  tsutsui 	u_int8_t config3;		/* Target configuration byte 3 */
    100  1.1  tsutsui };
    101  1.1  tsutsui 
    102  1.1  tsutsui struct trm_nvram {
    103  1.1  tsutsui 	u_int8_t subvendor_id[2];		/* 0,1 Sub Vendor ID */
    104  1.1  tsutsui 	u_int8_t subsys_id[2];			/* 2,3 Sub System ID */
    105  1.1  tsutsui 	u_int8_t subclass;			/* 4   Sub Class */
    106  1.1  tsutsui 	u_int8_t vendor_id[2];			/* 5,6 Vendor ID */
    107  1.1  tsutsui 	u_int8_t device_id[2];			/* 7,8 Device ID */
    108  1.1  tsutsui 	u_int8_t reserved0;			/* 9   Reserved */
    109  1.1  tsutsui 	struct nvram_target target[TRM_MAX_TARGETS];
    110  1.1  tsutsui 						/* 10,11,12,13
    111  1.1  tsutsui 						 * 14,15,16,17
    112  1.1  tsutsui 						 * ....
    113  1.1  tsutsui 						 * 70,71,72,73 */
    114  1.1  tsutsui 	u_int8_t scsi_id;			/* 74 Host Adapter SCSI ID */
    115  1.1  tsutsui 	u_int8_t channel_cfg;			/* 75 Channel configuration */
    116  1.1  tsutsui #define NAC_SCANLUN		0x20	/* Include LUN as BIOS device */
    117  1.3  tsutsui #define NAC_DO_PARITY_CHK	0x08    /* Parity check enable        */
    118  1.1  tsutsui #define NAC_POWERON_SCSI_RESET	0x04	/* Power on reset enable      */
    119  1.1  tsutsui #define NAC_GREATER_1G		0x02	/* > 1G support enable	      */
    120  1.1  tsutsui #define NAC_GT2DRIVES		0x01	/* Support more than 2 drives */
    121  1.1  tsutsui 	u_int8_t delay_time;			/* 76 Power on delay time */
    122  1.1  tsutsui 	u_int8_t max_tag;			/* 77 Maximum tags */
    123  1.1  tsutsui 	u_int8_t reserved1;			/* 78 */
    124  1.1  tsutsui 	u_int8_t boot_target;			/* 79 */
    125  1.1  tsutsui 	u_int8_t boot_lun;			/* 80 */
    126  1.1  tsutsui 	u_int8_t reserved2;			/* 81 */
    127  1.1  tsutsui 	u_int8_t reserved3[44];			/* 82,..125 */
    128  1.1  tsutsui 	u_int8_t checksum0;			/* 126 */
    129  1.1  tsutsui 	u_int8_t checksum1;			/* 127 */
    130  1.1  tsutsui #define TRM_NVRAM_CKSUM	0x1234
    131  1.1  tsutsui };
    132  1.1  tsutsui 
    133  1.1  tsutsui /* Nvram Initiater bits definition */
    134  1.1  tsutsui #define MORE2_DRV		0x00000001
    135  1.1  tsutsui #define GREATER_1G		0x00000002
    136  1.1  tsutsui #define RST_SCSI_BUS		0x00000004
    137  1.1  tsutsui #define ACTIVE_NEGATION		0x00000008
    138  1.1  tsutsui #define NO_SEEK			0x00000010
    139  1.1  tsutsui #define LUN_CHECK		0x00000020
    140  1.1  tsutsui 
    141  1.1  tsutsui #define trm_wait_30us()	DELAY(30)
    142  1.1  tsutsui 
    143  1.1  tsutsui /*
    144  1.1  tsutsui  *-----------------------------------------------------------------------
    145  1.1  tsutsui  *			SCSI Request Block
    146  1.1  tsutsui  *-----------------------------------------------------------------------
    147  1.1  tsutsui  */
    148  1.1  tsutsui struct trm_srb {
    149  1.1  tsutsui 	struct trm_srb *next;
    150  1.1  tsutsui 	struct trm_dcb *dcb;
    151  1.1  tsutsui 
    152  1.1  tsutsui 	struct trm_sg_entry *sgentry;
    153  1.1  tsutsui 	struct trm_sg_entry tempsg;	/* Temp sgentry when Request Sense */
    154  1.1  tsutsui 	/*
    155  1.1  tsutsui 	 * the scsipi_xfer for this cmd
    156  1.1  tsutsui 	 */
    157  1.1  tsutsui 	struct scsipi_xfer *xs;
    158  1.1  tsutsui 	bus_dmamap_t dmap;
    159  1.1  tsutsui 	bus_size_t sgoffset;		/* Xfer buf offset */
    160  1.1  tsutsui 
    161  1.1  tsutsui 	u_int32_t buflen;		/* Total xfer length */
    162  1.1  tsutsui 	u_int32_t templen;		/* Temp buflen when Request Sense */
    163  1.1  tsutsui 	u_int32_t sgaddr;		/* SGList physical starting address */
    164  1.1  tsutsui 
    165  1.1  tsutsui 	u_int state;			/* SRB State */
    166  1.1  tsutsui #define SRB_FREE		0x0000
    167  1.1  tsutsui #define SRB_WAIT		0x0001
    168  1.1  tsutsui #define SRB_READY		0x0002
    169  1.1  tsutsui #define SRB_MSGOUT		0x0004	/* arbitration+msg_out 1st byte */
    170  1.1  tsutsui #define SRB_MSGIN		0x0008
    171  1.1  tsutsui #define SRB_EXTEND_MSGIN	0x0010
    172  1.1  tsutsui #define SRB_COMMAND		0x0020
    173  1.1  tsutsui #define SRB_START_		0x0040	/* arbitration+msg_out+command_out */
    174  1.1  tsutsui #define SRB_DISCONNECT		0x0080
    175  1.1  tsutsui #define SRB_DATA_XFER		0x0100
    176  1.1  tsutsui #define SRB_XFERPAD		0x0200
    177  1.1  tsutsui #define SRB_STATUS		0x0400
    178  1.1  tsutsui #define SRB_COMPLETED		0x0800
    179  1.1  tsutsui #define SRB_ABORT_SENT		0x1000
    180  1.1  tsutsui #define SRB_DO_SYNC_NEGO	0x2000
    181  1.1  tsutsui #define SRB_DO_WIDE_NEGO	0x4000
    182  1.1  tsutsui #define SRB_UNEXPECT_RESEL	0x8000
    183  1.1  tsutsui 	u_int8_t *msg;
    184  1.1  tsutsui 
    185  1.1  tsutsui 	int sgcnt;
    186  1.1  tsutsui 	int sgindex;
    187  1.1  tsutsui 
    188  1.1  tsutsui 	int phase;			/* SCSI phase */
    189  1.1  tsutsui 	int hastat;			/* Host Adapter Status */
    190  1.1  tsutsui #define H_STATUS_GOOD		0x00
    191  1.1  tsutsui #define H_SEL_TIMEOUT		0x11
    192  1.1  tsutsui #define H_OVER_UNDER_RUN	0x12
    193  1.1  tsutsui #define H_UNEXP_BUS_FREE	0x13
    194  1.1  tsutsui #define H_TARGET_PHASE_F	0x14
    195  1.1  tsutsui #define H_INVALID_CCB_OP	0x16
    196  1.1  tsutsui #define H_LINK_CCB_BAD		0x17
    197  1.1  tsutsui #define H_BAD_TARGET_DIR	0x18
    198  1.1  tsutsui #define H_DUPLICATE_CCB		0x19
    199  1.1  tsutsui #define H_BAD_CCB_OR_SG		0x1A
    200  1.1  tsutsui #define H_ABORT			0xFF
    201  1.1  tsutsui 	int tastat;			/* Target SCSI Status Byte */
    202  1.1  tsutsui 	int flag;			/* SRBFlag */
    203  1.1  tsutsui #define DATAOUT			0x0080
    204  1.1  tsutsui #define DATAIN			0x0040
    205  1.1  tsutsui #define RESIDUAL_VALID		0x0020
    206  1.1  tsutsui #define ENABLE_TIMER		0x0010
    207  1.1  tsutsui #define RESET_DEV0		0x0004
    208  1.1  tsutsui #define ABORT_DEV		0x0002
    209  1.1  tsutsui #define AUTO_REQSENSE		0x0001
    210  1.1  tsutsui 	int srbstat;			/* SRB Status */
    211  1.1  tsutsui #define SRB_OK			0x01
    212  1.1  tsutsui #define ABORTION		0x02
    213  1.1  tsutsui #define OVER_RUN		0x04
    214  1.1  tsutsui #define UNDER_RUN		0x08
    215  1.1  tsutsui #define PARITY_ERROR		0x10
    216  1.1  tsutsui #define SRB_ERROR		0x20
    217  1.1  tsutsui 	int tagnum;			/* Tag number */
    218  1.1  tsutsui 	int retry;			/* Retry Count */
    219  1.1  tsutsui 	int msgcnt;
    220  1.1  tsutsui 
    221  1.1  tsutsui 	int cmdlen;			/* SCSI command length */
    222  1.1  tsutsui 	u_int8_t cmd[12];       	/* SCSI command */
    223  1.1  tsutsui 	u_int8_t tempcmd[6];		/* Temp cmd when Request Sense */
    224  1.1  tsutsui 
    225  1.1  tsutsui 	u_int8_t msgin[6];
    226  1.1  tsutsui 	u_int8_t msgout[6];
    227  1.1  tsutsui };
    228  1.1  tsutsui 
    229  1.1  tsutsui /*
    230  1.1  tsutsui  *-----------------------------------------------------------------------
    231  1.1  tsutsui  *			Device Control Block
    232  1.1  tsutsui  *-----------------------------------------------------------------------
    233  1.1  tsutsui  */
    234  1.1  tsutsui struct trm_dcb {
    235  1.1  tsutsui 	struct trm_dcb *next;
    236  1.1  tsutsui 
    237  1.1  tsutsui 	struct trm_srb *waitsrb;
    238  1.1  tsutsui 	struct trm_srb *last_waitsrb;
    239  1.1  tsutsui 
    240  1.1  tsutsui 	struct trm_srb *gosrb;
    241  1.1  tsutsui 	struct trm_srb *last_gosrb;
    242  1.1  tsutsui 
    243  1.1  tsutsui 	struct trm_srb *actsrb;
    244  1.1  tsutsui 
    245  1.1  tsutsui 	int gosrb_cnt;
    246  1.1  tsutsui 	u_int maxcmd;		/* Max command */
    247  1.1  tsutsui 
    248  1.1  tsutsui 	int id;			/* SCSI Target ID  (SCSI Only) */
    249  1.1  tsutsui 	int lun;		/* SCSI Log.  Unit (SCSI Only) */
    250  1.1  tsutsui 
    251  1.1  tsutsui 	u_int8_t tagmask;	/* Tag mask */
    252  1.1  tsutsui 
    253  1.1  tsutsui 	u_int8_t tacfg;		/* Target Config */
    254  1.1  tsutsui 	u_int8_t idmsg;		/* Identify Msg */
    255  1.1  tsutsui 	u_int8_t period;	/* Max Period for nego. */
    256  1.1  tsutsui 
    257  1.1  tsutsui 	u_int8_t synctl;	/* Sync control for reg. */
    258  1.1  tsutsui 	u_int8_t offset;	/* Sync offset for reg. and nego.(low nibble) */
    259  1.1  tsutsui 	u_int8_t mode;		/* Sync mode ? (1 sync):(0 async)  */
    260  1.1  tsutsui #define SYNC_NEGO_ENABLE	0x01
    261  1.1  tsutsui #define SYNC_NEGO_DONE		0x02
    262  1.1  tsutsui #define WIDE_NEGO_ENABLE	0x04
    263  1.1  tsutsui #define WIDE_NEGO_DONE		0x08
    264  1.1  tsutsui #define EN_TAG_QUEUING		0x10
    265  1.1  tsutsui #define EN_ATN_STOP		0x20
    266  1.1  tsutsui #define SYNC_NEGO_OFFSET	15
    267  1.1  tsutsui 	u_int8_t flag;
    268  1.1  tsutsui #define ABORT_DEV_		0x01
    269  1.1  tsutsui #define SHOW_MESSAGE_		0x02
    270  1.1  tsutsui 	u_int8_t type;		/* Device Type */
    271  1.1  tsutsui };
    272  1.1  tsutsui 
    273  1.1  tsutsui /*
    274  1.1  tsutsui  *-----------------------------------------------------------------------
    275  1.1  tsutsui  *			Adapter Control Block
    276  1.1  tsutsui  *-----------------------------------------------------------------------
    277  1.1  tsutsui  */
    278  1.1  tsutsui struct trm_softc {
    279  1.1  tsutsui 	struct device sc_dev;
    280  1.1  tsutsui 
    281  1.1  tsutsui 	bus_space_tag_t sc_iot;
    282  1.1  tsutsui 	bus_space_handle_t sc_ioh;
    283  1.1  tsutsui 	bus_dma_tag_t sc_dmat;
    284  1.1  tsutsui 	bus_dmamap_t sc_dmamap;	/* Map the control structures */
    285  1.1  tsutsui 
    286  1.1  tsutsui 	struct trm_dcb *sc_linkdcb;
    287  1.1  tsutsui 	struct trm_dcb *sc_roundcb;
    288  1.1  tsutsui 
    289  1.1  tsutsui 	struct trm_dcb *sc_actdcb;
    290  1.1  tsutsui 	struct trm_dcb *sc_dcb[TRM_MAX_TARGETS][8];
    291  1.1  tsutsui 
    292  1.1  tsutsui 	struct trm_srb *sc_freesrb;
    293  1.1  tsutsui 	struct trm_srb *sc_srb;	/* SRB array */
    294  1.2  tsutsui 	struct trm_srb sc_tempsrb;
    295  1.1  tsutsui 
    296  1.1  tsutsui 	struct trm_sg_entry *sc_sglist;
    297  1.1  tsutsui 
    298  1.1  tsutsui 	int maxid;
    299  1.1  tsutsui 	int maxtag;		/* Max Tag number */
    300  1.1  tsutsui 	/*
    301  1.1  tsutsui 	 * Link to the generic SCSI driver
    302  1.1  tsutsui 	 */
    303  1.1  tsutsui 	struct scsipi_channel sc_channel;
    304  1.1  tsutsui 	struct scsipi_adapter sc_adapter;
    305  1.1  tsutsui 
    306  1.1  tsutsui 	int sc_id;		/* Adapter SCSI Target ID */
    307  1.1  tsutsui 
    308  1.1  tsutsui 	int devcnt;		/* Device Count */
    309  1.1  tsutsui 
    310  1.1  tsutsui 	int devflag[TRM_MAX_TARGETS][8]; /* flag of initDCB for device */
    311  1.1  tsutsui 
    312  1.1  tsutsui 	int devscan[TRM_MAX_TARGETS][8];
    313  1.1  tsutsui 	int devscan_end;
    314  1.1  tsutsui 	int cur_offset;		/* Current Sync offset */
    315  1.1  tsutsui 
    316  1.1  tsutsui 	struct trm_nvram sc_eeprom;
    317  1.1  tsutsui 	int sc_config;
    318  1.1  tsutsui #define HCC_WIDE_CARD		0x20
    319  1.1  tsutsui #define HCC_SCSI_RESET		0x10
    320  1.1  tsutsui #define HCC_PARITY		0x08
    321  1.1  tsutsui #define HCC_AUTOTERM		0x04
    322  1.1  tsutsui #define HCC_LOW8TERM		0x02
    323  1.1  tsutsui #define HCC_UP8TERM		0x01
    324  1.1  tsutsui 	int sc_flag;
    325  1.1  tsutsui #define RESET_DEV		0x01
    326  1.1  tsutsui #define RESET_DETECT		0x02
    327  1.1  tsutsui #define RESET_DONE		0x04
    328  1.1  tsutsui };
    329  1.1  tsutsui 
    330  1.1  tsutsui /*
    331  1.1  tsutsui  * SCSI Status codes not defined in scsi_all.h
    332  1.1  tsutsui  */
    333  1.1  tsutsui #define SCSI_COND_MET		0x04	/* Condition Met              */
    334  1.1  tsutsui #define SCSI_INTERM_COND_MET	0x14	/* Intermediate condition met */
    335  1.1  tsutsui #define SCSI_UNEXP_BUS_FREE	0xFD	/* Unexpect Bus Free          */
    336  1.1  tsutsui #define SCSI_BUS_RST_DETECT	0xFE	/* Scsi Bus Reset detected    */
    337  1.1  tsutsui #define SCSI_SEL_TIMEOUT	0xFF	/* Selection Time out         */
    338  1.1  tsutsui 
    339  1.1  tsutsui static void trm_rewait_srb(struct trm_dcb *, struct trm_srb *);
    340  1.1  tsutsui static void trm_wait_srb(struct trm_softc *);
    341  1.1  tsutsui static void trm_reset_device(struct trm_softc *);
    342  1.1  tsutsui static void trm_recover_srb(struct trm_softc *);
    343  1.1  tsutsui static int  trm_start_scsi(struct trm_softc *, struct trm_dcb *,
    344  1.1  tsutsui     struct trm_srb *);
    345  1.1  tsutsui static int  trm_intr(void *);
    346  1.1  tsutsui 
    347  1.1  tsutsui static void trm_dataout_phase0(struct trm_softc *, struct trm_srb *, int *);
    348  1.1  tsutsui static void trm_datain_phase0(struct trm_softc *, struct trm_srb *, int *);
    349  1.1  tsutsui static void trm_command_phase0(struct trm_softc *, struct trm_srb *, int *);
    350  1.1  tsutsui static void trm_status_phase0(struct trm_softc *, struct trm_srb *, int *);
    351  1.1  tsutsui static void trm_msgout_phase0(struct trm_softc *, struct trm_srb *, int *);
    352  1.1  tsutsui static void trm_msgin_phase0(struct trm_softc *, struct trm_srb *, int *);
    353  1.1  tsutsui static void trm_dataout_phase1(struct trm_softc *, struct trm_srb *, int *);
    354  1.1  tsutsui static void trm_datain_phase1(struct trm_softc *, struct trm_srb *, int *);
    355  1.1  tsutsui static void trm_command_phase1(struct trm_softc *, struct trm_srb *, int *);
    356  1.1  tsutsui static void trm_status_phase1(struct trm_softc *, struct trm_srb *, int *);
    357  1.1  tsutsui static void trm_msgout_phase1(struct trm_softc *, struct trm_srb *, int *);
    358  1.1  tsutsui static void trm_msgin_phase1(struct trm_softc *, struct trm_srb *, int *);
    359  1.1  tsutsui static void trm_nop0(struct trm_softc *, struct trm_srb *, int *);
    360  1.1  tsutsui static void trm_nop1(struct trm_softc *, struct trm_srb *, int *);
    361  1.1  tsutsui 
    362  1.1  tsutsui static void trm_set_xfer_rate(struct trm_softc *, struct trm_srb *,
    363  1.1  tsutsui     struct trm_dcb *);
    364  1.1  tsutsui static void trm_dataio_xfer(struct trm_softc *, struct trm_srb *, int);
    365  1.1  tsutsui static void trm_disconnect(struct trm_softc *);
    366  1.1  tsutsui static void trm_reselect(struct trm_softc *);
    367  1.1  tsutsui static void trm_srb_done(struct trm_softc *, struct trm_dcb *,
    368  1.1  tsutsui     struct trm_srb *);
    369  1.1  tsutsui static void trm_doing_srb_done(struct trm_softc *);
    370  1.1  tsutsui static void trm_scsi_reset_detect(struct trm_softc *);
    371  1.1  tsutsui static void trm_reset_scsi_bus(struct trm_softc *);
    372  1.1  tsutsui static void trm_request_sense(struct trm_softc *, struct trm_dcb *,
    373  1.1  tsutsui     struct trm_srb *);
    374  1.1  tsutsui static void trm_msgout_abort(struct trm_softc *, struct trm_srb *);
    375  1.1  tsutsui static void trm_timeout(void *);
    376  1.1  tsutsui static void trm_reset(struct trm_softc *);
    377  1.1  tsutsui static void trm_send_srb(struct scsipi_xfer *, struct trm_softc *,
    378  1.1  tsutsui     struct trm_srb *);
    379  1.1  tsutsui static int  trm_init(struct trm_softc *);
    380  1.1  tsutsui static void trm_init_adapter(struct trm_softc *);
    381  1.1  tsutsui static void trm_init_dcb(struct trm_softc *, struct trm_dcb *,
    382  1.1  tsutsui     struct scsipi_xfer *);
    383  1.1  tsutsui static void trm_link_srb(struct trm_softc *);
    384  1.1  tsutsui static void trm_init_sc(struct trm_softc *);
    385  1.1  tsutsui static void trm_check_eeprom(struct trm_softc *, struct trm_nvram *);
    386  1.1  tsutsui static void trm_release_srb(struct trm_softc *, struct trm_dcb *,
    387  1.1  tsutsui     struct trm_srb *);
    388  1.1  tsutsui void trm_scsipi_request(struct scsipi_channel *, scsipi_adapter_req_t, void *);
    389  1.1  tsutsui 
    390  1.1  tsutsui static void trm_eeprom_read_all(struct trm_softc *, struct trm_nvram *);
    391  1.1  tsutsui static void trm_eeprom_write_all(struct trm_softc *, struct trm_nvram *);
    392  1.1  tsutsui static void trm_eeprom_set_data(struct trm_softc *, u_int8_t, u_int8_t);
    393  1.1  tsutsui static void trm_eeprom_write_cmd(struct trm_softc *, u_int8_t, u_int8_t);
    394  1.1  tsutsui static u_int8_t trm_eeprom_get_data(struct trm_softc *, u_int8_t);
    395  1.1  tsutsui 
    396  1.1  tsutsui static int  trm_probe(struct device *, struct cfdata *, void *);
    397  1.1  tsutsui static void trm_attach(struct device *, struct device *, void *);
    398  1.1  tsutsui 
    399  1.1  tsutsui struct cfattach trm_ca = {
    400  1.1  tsutsui 	sizeof(struct trm_softc), trm_probe, trm_attach
    401  1.1  tsutsui };
    402  1.1  tsutsui 
    403  1.1  tsutsui 
    404  1.1  tsutsui /*
    405  1.1  tsutsui  * state_v = (void *) trm_scsi_phase0[phase]
    406  1.1  tsutsui  */
    407  1.1  tsutsui static void *trm_scsi_phase0[] = {
    408  1.1  tsutsui 	trm_dataout_phase0,	/* phase:0 */
    409  1.1  tsutsui 	trm_datain_phase0,	/* phase:1 */
    410  1.1  tsutsui 	trm_command_phase0,	/* phase:2 */
    411  1.1  tsutsui 	trm_status_phase0,	/* phase:3 */
    412  1.1  tsutsui 	trm_nop0,		/* phase:4 */
    413  1.1  tsutsui 	trm_nop1,		/* phase:5 */
    414  1.1  tsutsui 	trm_msgout_phase0,	/* phase:6 */
    415  1.1  tsutsui 	trm_msgin_phase0,	/* phase:7 */
    416  1.1  tsutsui };
    417  1.1  tsutsui 
    418  1.1  tsutsui /*
    419  1.1  tsutsui  * state_v = (void *) trm_scsi_phase1[phase]
    420  1.1  tsutsui  */
    421  1.1  tsutsui static void *trm_scsi_phase1[] = {
    422  1.1  tsutsui 	trm_dataout_phase1,	/* phase:0 */
    423  1.1  tsutsui 	trm_datain_phase1,	/* phase:1 */
    424  1.1  tsutsui 	trm_command_phase1,	/* phase:2 */
    425  1.1  tsutsui 	trm_status_phase1,	/* phase:3 */
    426  1.1  tsutsui 	trm_nop0,		/* phase:4 */
    427  1.1  tsutsui 	trm_nop1,		/* phase:5 */
    428  1.1  tsutsui 	trm_msgout_phase1,	/* phase:6 */
    429  1.1  tsutsui 	trm_msgin_phase1,	/* phase:7 */
    430  1.1  tsutsui };
    431  1.1  tsutsui 
    432  1.1  tsutsui /* real period: */
    433  1.1  tsutsui static const u_int8_t trm_clock_period[] = {
    434  1.1  tsutsui 	13,	/*  52  ns 20.0 MB/sec */
    435  1.1  tsutsui 	18,	/*  72  ns 13.3 MB/sec */
    436  1.1  tsutsui 	25,	/* 100  ns 10.0 MB/sec */
    437  1.1  tsutsui 	31,	/* 124  ns  8.0 MB/sec */
    438  1.1  tsutsui 	37,	/* 148  ns  6.6 MB/sec */
    439  1.1  tsutsui 	43,	/* 172  ns  5.7 MB/sec */
    440  1.1  tsutsui 	50,	/* 200  ns  5.0 MB/sec */
    441  1.1  tsutsui 	62	/* 248  ns  4.0 MB/sec */
    442  1.1  tsutsui };
    443  1.1  tsutsui 
    444  1.1  tsutsui /*
    445  1.1  tsutsui  * Q back to pending Q
    446  1.1  tsutsui  */
    447  1.1  tsutsui static void
    448  1.1  tsutsui trm_rewait_srb(dcb, srb)
    449  1.1  tsutsui 	struct trm_dcb *dcb;
    450  1.1  tsutsui 	struct trm_srb *srb;
    451  1.1  tsutsui {
    452  1.1  tsutsui 	struct trm_srb *psrb1;
    453  1.1  tsutsui 	int s;
    454  1.1  tsutsui 
    455  1.1  tsutsui 	s = splbio();
    456  1.1  tsutsui 
    457  1.1  tsutsui 	dcb->gosrb_cnt--;
    458  1.1  tsutsui 	psrb1 = dcb->gosrb;
    459  1.1  tsutsui 	if (srb == psrb1)
    460  1.1  tsutsui 		dcb->gosrb = psrb1->next;
    461  1.1  tsutsui 	else {
    462  1.1  tsutsui 		while (srb != psrb1->next)
    463  1.1  tsutsui 			psrb1 = psrb1->next;
    464  1.1  tsutsui 
    465  1.1  tsutsui 		psrb1->next = srb->next;
    466  1.1  tsutsui 		if (srb == dcb->last_gosrb)
    467  1.1  tsutsui 			dcb->last_gosrb = psrb1;
    468  1.1  tsutsui 	}
    469  1.1  tsutsui 	if (dcb->waitsrb) {
    470  1.1  tsutsui 		srb->next = dcb->waitsrb;
    471  1.1  tsutsui 		dcb->waitsrb = srb;
    472  1.1  tsutsui 	} else {
    473  1.1  tsutsui 		srb->next = NULL;
    474  1.1  tsutsui 		dcb->waitsrb = srb;
    475  1.1  tsutsui 		dcb->last_waitsrb = srb;
    476  1.1  tsutsui 	}
    477  1.1  tsutsui 	dcb->tagmask &= ~(1 << srb->tagnum); /* Free TAG number */
    478  1.1  tsutsui 
    479  1.1  tsutsui 	splx(s);
    480  1.1  tsutsui }
    481  1.1  tsutsui 
    482  1.1  tsutsui static void
    483  1.1  tsutsui trm_wait_srb(sc)
    484  1.1  tsutsui 	struct trm_softc *sc;
    485  1.1  tsutsui {
    486  1.1  tsutsui 	struct trm_dcb *ptr, *ptr1;
    487  1.1  tsutsui 	struct trm_srb *srb;
    488  1.1  tsutsui 	int s;
    489  1.1  tsutsui 
    490  1.1  tsutsui 	s = splbio();
    491  1.1  tsutsui 
    492  1.1  tsutsui 	if (sc->sc_actdcb == NULL &&
    493  1.1  tsutsui 	    (sc->sc_flag & (RESET_DETECT | RESET_DONE | RESET_DEV)) == 0) {
    494  1.1  tsutsui 		ptr = sc->sc_roundcb;
    495  1.1  tsutsui 		if (ptr == NULL) {
    496  1.1  tsutsui 			ptr = sc->sc_linkdcb;
    497  1.1  tsutsui 			sc->sc_roundcb = ptr;
    498  1.1  tsutsui 		}
    499  1.1  tsutsui 		for (ptr1 = ptr; ptr1 != NULL;) {
    500  1.1  tsutsui 			sc->sc_roundcb = ptr1->next;
    501  1.1  tsutsui 			if (ptr1->maxcmd <= ptr1->gosrb_cnt ||
    502  1.1  tsutsui 			    (srb = ptr1->waitsrb) == NULL) {
    503  1.1  tsutsui 				if (sc->sc_roundcb == ptr)
    504  1.1  tsutsui 					break;
    505  1.1  tsutsui 				ptr1 = ptr1->next;
    506  1.1  tsutsui 			} else {
    507  1.1  tsutsui 				if (trm_start_scsi(sc, ptr1, srb) == 0) {
    508  1.1  tsutsui 					/*
    509  1.1  tsutsui 					 * If trm_start_scsi return 0 :
    510  1.1  tsutsui 					 * current interrupt status is
    511  1.1  tsutsui 					 * interrupt enable.  It's said that
    512  1.1  tsutsui 					 * SCSI processor is unoccupied
    513  1.1  tsutsui 					 */
    514  1.1  tsutsui 					ptr1->gosrb_cnt++;
    515  1.1  tsutsui 					if (ptr1->last_waitsrb == srb) {
    516  1.1  tsutsui 						ptr1->waitsrb = NULL;
    517  1.1  tsutsui 						ptr1->last_waitsrb = NULL;
    518  1.1  tsutsui 					} else
    519  1.1  tsutsui 						ptr1->waitsrb = srb->next;
    520  1.1  tsutsui 
    521  1.1  tsutsui 					srb->next = NULL;
    522  1.1  tsutsui 					if (ptr1->gosrb != NULL)
    523  1.1  tsutsui 						ptr1->last_gosrb->next = srb;
    524  1.1  tsutsui 					else
    525  1.1  tsutsui 						ptr1->gosrb = srb;
    526  1.1  tsutsui 
    527  1.1  tsutsui 					ptr1->last_gosrb = srb;
    528  1.1  tsutsui 				}
    529  1.1  tsutsui 				break;
    530  1.1  tsutsui 			}
    531  1.1  tsutsui 		}
    532  1.1  tsutsui 	}
    533  1.1  tsutsui 	splx(s);
    534  1.1  tsutsui }
    535  1.1  tsutsui 
    536  1.1  tsutsui static void
    537  1.1  tsutsui trm_send_srb(xs, sc, srb)
    538  1.1  tsutsui 	struct scsipi_xfer *xs;
    539  1.1  tsutsui 	struct trm_softc *sc;
    540  1.1  tsutsui 	struct trm_srb *srb;
    541  1.1  tsutsui {
    542  1.1  tsutsui 	struct trm_dcb *dcb;
    543  1.1  tsutsui 	int s;
    544  1.1  tsutsui 
    545  1.1  tsutsui #ifdef TRM_DEBUG
    546  1.1  tsutsui 	printf("trm_send_srb..........\n");
    547  1.1  tsutsui #endif
    548  1.1  tsutsui 	s = splbio();
    549  1.1  tsutsui 
    550  1.1  tsutsui 	/*
    551  1.1  tsutsui 	 *  now get the DCB from upper layer( OS )
    552  1.1  tsutsui 	 */
    553  1.1  tsutsui 	dcb = srb->dcb;
    554  1.1  tsutsui 
    555  1.1  tsutsui 	if (dcb->maxcmd <= dcb->gosrb_cnt ||
    556  1.1  tsutsui 	    sc->sc_actdcb != NULL ||
    557  1.1  tsutsui 	    (sc->sc_flag & (RESET_DETECT | RESET_DONE | RESET_DEV))) {
    558  1.1  tsutsui 		if (dcb->waitsrb != NULL) {
    559  1.1  tsutsui 			dcb->last_waitsrb->next = srb;
    560  1.1  tsutsui 			dcb->last_waitsrb = srb;
    561  1.1  tsutsui 			srb->next = NULL;
    562  1.1  tsutsui 		} else {
    563  1.1  tsutsui 			dcb->waitsrb = srb;
    564  1.1  tsutsui 			dcb->last_waitsrb = srb;
    565  1.1  tsutsui 		}
    566  1.1  tsutsui 		splx(s);
    567  1.1  tsutsui 		return;
    568  1.1  tsutsui 	}
    569  1.1  tsutsui 	if (dcb->waitsrb != NULL) {
    570  1.1  tsutsui 		dcb->last_waitsrb->next = srb;
    571  1.1  tsutsui 		dcb->last_waitsrb = srb;
    572  1.1  tsutsui 		srb->next = NULL;
    573  1.1  tsutsui 		/* srb = GetWaitingSRB(dcb); */
    574  1.1  tsutsui 		srb = dcb->waitsrb;
    575  1.1  tsutsui 		dcb->waitsrb = srb->next;
    576  1.1  tsutsui 		srb->next = NULL;
    577  1.1  tsutsui 	}
    578  1.1  tsutsui 	if (trm_start_scsi(sc, dcb, srb) == 0) {
    579  1.1  tsutsui 		/*
    580  1.1  tsutsui 		 * If trm_start_scsi return 0: current interrupt status
    581  1.1  tsutsui 		 * is interrupt enable.  It's said that SCSI processor is
    582  1.1  tsutsui 		 * unoccupied.
    583  1.1  tsutsui 		 */
    584  1.1  tsutsui 		dcb->gosrb_cnt++;	/* stack waiting SRB */
    585  1.1  tsutsui 		if (dcb->gosrb != NULL) {
    586  1.1  tsutsui 			dcb->last_gosrb->next = srb;
    587  1.1  tsutsui 			dcb->last_gosrb = srb;
    588  1.1  tsutsui 		} else {
    589  1.1  tsutsui 			dcb->gosrb = srb;
    590  1.1  tsutsui 			dcb->last_gosrb = srb;
    591  1.1  tsutsui 		}
    592  1.1  tsutsui 	} else {
    593  1.1  tsutsui 		/*
    594  1.1  tsutsui 		 * If trm_start_scsi return 1: current interrupt status
    595  1.1  tsutsui 		 * is interrupt disreenable.  It's said that SCSI processor
    596  1.1  tsutsui 		 * has more one SRB need to do we need reQ back SRB.
    597  1.1  tsutsui 		 */
    598  1.1  tsutsui 		if (dcb->waitsrb != NULL) {
    599  1.1  tsutsui 			srb->next = dcb->waitsrb;
    600  1.1  tsutsui 			dcb->waitsrb = srb;
    601  1.1  tsutsui 		} else {
    602  1.1  tsutsui 			srb->next = NULL;
    603  1.1  tsutsui 			dcb->waitsrb = srb;
    604  1.1  tsutsui 			dcb->last_waitsrb = srb;
    605  1.1  tsutsui 		}
    606  1.1  tsutsui 	}
    607  1.1  tsutsui 
    608  1.1  tsutsui 	splx(s);
    609  1.1  tsutsui }
    610  1.1  tsutsui 
    611  1.1  tsutsui /*
    612  1.1  tsutsui  * Called by GENERIC SCSI driver
    613  1.1  tsutsui  * enqueues a SCSI command
    614  1.1  tsutsui  */
    615  1.1  tsutsui void
    616  1.1  tsutsui trm_scsipi_request(chan, req, arg)
    617  1.1  tsutsui 	struct scsipi_channel *chan;
    618  1.1  tsutsui 	scsipi_adapter_req_t req;
    619  1.1  tsutsui 	void *arg;
    620  1.1  tsutsui {
    621  1.1  tsutsui 	bus_space_tag_t iot;
    622  1.1  tsutsui 	bus_space_handle_t ioh;
    623  1.1  tsutsui 	struct trm_softc *sc;
    624  1.1  tsutsui 	struct trm_dcb *dcb = NULL;
    625  1.1  tsutsui 	struct trm_srb *srb;
    626  1.1  tsutsui 	struct scsipi_xfer *xs;
    627  1.1  tsutsui 	int error, i, id, lun, s;
    628  1.1  tsutsui 
    629  1.1  tsutsui 	sc = (struct trm_softc *)chan->chan_adapter->adapt_dev;
    630  1.1  tsutsui 	iot = sc->sc_iot;
    631  1.1  tsutsui 	ioh = sc->sc_ioh;
    632  1.1  tsutsui 
    633  1.1  tsutsui 	switch (req) {
    634  1.1  tsutsui 	case ADAPTER_REQ_RUN_XFER:
    635  1.1  tsutsui 		xs = arg;
    636  1.1  tsutsui 		id = xs->xs_periph->periph_target;
    637  1.1  tsutsui 		lun = xs->xs_periph->periph_lun;
    638  1.1  tsutsui #ifdef TRM_DEBUG
    639  1.1  tsutsui 		printf("trm_scsipi_request.....\n");
    640  1.1  tsutsui 		printf("%s: id= %d lun= %d\n", sc->sc_dev.dv_xname, id, lun);
    641  1.1  tsutsui 		printf("sc->devscan[id][lun]= %d\n", sc->devscan[id][lun]);
    642  1.1  tsutsui #endif
    643  1.1  tsutsui 		if ((id > sc->maxid) || (lun > 7)) {
    644  1.1  tsutsui 			xs->error = XS_DRIVER_STUFFUP;
    645  1.1  tsutsui 			return;
    646  1.1  tsutsui 		}
    647  1.1  tsutsui 		dcb = sc->sc_dcb[id][lun];
    648  1.1  tsutsui 		if (sc->devscan[id][lun] != 0 && sc->devflag[id][lun] == 0) {
    649  1.1  tsutsui 			/*
    650  1.1  tsutsui 			 * Scan SCSI BUS => trm_init_dcb
    651  1.1  tsutsui 			 */
    652  1.1  tsutsui 			if (sc->devcnt < TRM_MAX_TARGETS) {
    653  1.1  tsutsui #ifdef TRM_DEBUG
    654  1.1  tsutsui 			  	printf("trm_init_dcb: dcb=%8x, ", (int) dcb);
    655  1.1  tsutsui 				printf("ID=%2x, LUN=%2x\n", id, lun);
    656  1.1  tsutsui #endif
    657  1.1  tsutsui 				sc->devflag[id][lun] = 1;
    658  1.1  tsutsui 				trm_init_dcb(sc, dcb, xs);
    659  1.1  tsutsui 			} else {
    660  1.1  tsutsui 			  	printf("%s: ", sc->sc_dev.dv_xname);
    661  1.1  tsutsui 				printf("sc->devcnt >= TRM_MAX_TARGETS\n");
    662  1.1  tsutsui 				xs->error = XS_DRIVER_STUFFUP;
    663  1.1  tsutsui 				return;
    664  1.1  tsutsui 			}
    665  1.1  tsutsui 		}
    666  1.1  tsutsui 
    667  1.1  tsutsui 		if (xs->xs_control & XS_CTL_RESET) {
    668  1.1  tsutsui 			trm_reset(sc);
    669  1.1  tsutsui 			xs->error = XS_NOERROR | XS_RESET;
    670  1.1  tsutsui 			return;
    671  1.1  tsutsui 		}
    672  1.1  tsutsui 		if (xs->xs_status & XS_STS_DONE) {
    673  1.1  tsutsui 			printf("%s: Is it done?\n", sc->sc_dev.dv_xname);
    674  1.1  tsutsui 			xs->xs_status &= ~XS_STS_DONE;
    675  1.1  tsutsui 		}
    676  1.1  tsutsui 		xs->error = 0;
    677  1.1  tsutsui 		xs->status = 0;
    678  1.1  tsutsui 		xs->resid = 0;
    679  1.1  tsutsui 
    680  1.1  tsutsui 		s = splbio();
    681  1.1  tsutsui 
    682  1.1  tsutsui 		/* Get SRB */
    683  1.1  tsutsui 		srb = sc->sc_freesrb;
    684  1.1  tsutsui 		if (srb != NULL) {
    685  1.1  tsutsui 			sc->sc_freesrb = srb->next;
    686  1.1  tsutsui 			srb->next = NULL;
    687  1.1  tsutsui #ifdef TRM_DEBUG
    688  1.1  tsutsui 			printf("srb = %8p sc->sc_freesrb= %8p\n",
    689  1.1  tsutsui 			    srb, sc->sc_freesrb);
    690  1.1  tsutsui #endif
    691  1.1  tsutsui 		} else {
    692  1.1  tsutsui 			xs->error = XS_RESOURCE_SHORTAGE;
    693  1.1  tsutsui 			scsipi_done(xs);
    694  1.1  tsutsui 			splx(s);
    695  1.1  tsutsui 			return;
    696  1.1  tsutsui 		}
    697  1.1  tsutsui 		/*
    698  1.1  tsutsui 		 * XXX BuildSRB(srb ,dcb); XXX
    699  1.1  tsutsui 		 */
    700  1.1  tsutsui 		srb->dcb = dcb;
    701  1.1  tsutsui 		srb->xs = xs;
    702  1.1  tsutsui 		srb->cmdlen = xs->cmdlen;
    703  1.1  tsutsui 		/*
    704  1.1  tsutsui 		 * Move layer of CAM command block to layer of SCSI
    705  1.1  tsutsui 		 * Request Block for SCSI processor command doing.
    706  1.1  tsutsui 		 */
    707  1.1  tsutsui 		memcpy(srb->cmd, xs->cmd, xs->cmdlen);
    708  1.1  tsutsui 		if (xs->datalen > 0) {
    709  1.1  tsutsui #ifdef TRM_DEBUG
    710  1.1  tsutsui 			printf("xs->datalen...\n");
    711  1.1  tsutsui 			printf("sc->sc_dmat=%x\n", (int) sc->sc_dmat);
    712  1.1  tsutsui 			printf("srb->dmap=%x\n", (int) srb->dmap);
    713  1.1  tsutsui 			printf("xs->data=%x\n", (int) xs->data);
    714  1.1  tsutsui 			printf("xs->datalen=%x\n", (int) xs->datalen);
    715  1.1  tsutsui #endif
    716  1.1  tsutsui 			if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap,
    717  1.1  tsutsui 			    xs->data, xs->datalen, NULL,
    718  1.1  tsutsui 			    (xs->xs_control & XS_CTL_NOSLEEP) ?
    719  1.1  tsutsui 			    BUS_DMA_NOWAIT : BUS_DMA_WAITOK)) != 0) {
    720  1.1  tsutsui 				printf("%s: DMA transfer map unable to load, "
    721  1.1  tsutsui 				    "error = %d\n", sc->sc_dev.dv_xname, error);
    722  1.1  tsutsui 				xs->error = XS_DRIVER_STUFFUP;
    723  1.1  tsutsui 				/*
    724  1.1  tsutsui 				 * free SRB
    725  1.1  tsutsui 				 */
    726  1.1  tsutsui 				srb->next = sc->sc_freesrb;
    727  1.1  tsutsui 				sc->sc_freesrb = srb;
    728  1.3  tsutsui 				splx(s);
    729  1.1  tsutsui 				return;
    730  1.1  tsutsui 			}
    731  1.1  tsutsui 			bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
    732  1.1  tsutsui 			    srb->dmap->dm_mapsize,
    733  1.1  tsutsui 			    (xs->xs_control & XS_CTL_DATA_IN) ?
    734  1.1  tsutsui 			    BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
    735  1.1  tsutsui 
    736  1.1  tsutsui 			/* Set up the scatter gather list */
    737  1.1  tsutsui 			for (i = 0; i < srb->dmap->dm_nsegs; i++) {
    738  1.1  tsutsui 				srb->sgentry[i].address =
    739  1.1  tsutsui 				    htole32(srb->dmap->dm_segs[i].ds_addr);
    740  1.1  tsutsui 				srb->sgentry[i].length =
    741  1.1  tsutsui 				    htole32(srb->dmap->dm_segs[i].ds_len);
    742  1.1  tsutsui 			}
    743  1.1  tsutsui 			srb->buflen = xs->datalen;
    744  1.1  tsutsui 			srb->sgcnt = srb->dmap->dm_nsegs;
    745  1.1  tsutsui 		} else {
    746  1.1  tsutsui 			srb->sgentry[0].address = 0;
    747  1.1  tsutsui 			srb->sgentry[0].length = 0;
    748  1.1  tsutsui 			srb->buflen = 0;
    749  1.1  tsutsui 			srb->sgcnt = 0;
    750  1.1  tsutsui 		}
    751  1.1  tsutsui 		bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap,
    752  1.1  tsutsui 		    srb->sgoffset, TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
    753  1.1  tsutsui 
    754  1.1  tsutsui 		if (dcb->type != T_SEQUENTIAL)
    755  1.1  tsutsui 			srb->retry = 1;
    756  1.1  tsutsui 		else
    757  1.1  tsutsui 			srb->retry = 0;
    758  1.1  tsutsui 
    759  1.1  tsutsui 		srb->sgindex = 0;
    760  1.1  tsutsui 		srb->hastat = 0;
    761  1.1  tsutsui 		srb->tastat = 0;
    762  1.1  tsutsui 		srb->msgcnt = 0;
    763  1.1  tsutsui 		srb->srbstat = 0;
    764  1.1  tsutsui 		srb->flag = 0;
    765  1.1  tsutsui 		srb->state = 0;
    766  1.1  tsutsui 		srb->phase = PH_BUS_FREE;	/* SCSI bus free Phase */
    767  1.1  tsutsui 
    768  1.1  tsutsui 		trm_send_srb(xs, sc, srb);
    769  1.1  tsutsui 		splx(s);
    770  1.1  tsutsui 
    771  1.1  tsutsui 		if ((xs->xs_control & XS_CTL_POLL) == 0) {
    772  1.1  tsutsui 			int timeout = xs->timeout;
    773  1.1  tsutsui 			timeout = (timeout > 100000) ?
    774  1.1  tsutsui 			    timeout / 1000 * hz : timeout * hz / 1000;
    775  1.1  tsutsui 			callout_reset(&xs->xs_callout, timeout,
    776  1.1  tsutsui 			    trm_timeout, srb);
    777  1.1  tsutsui 		} else {
    778  1.1  tsutsui 			s = splbio();
    779  1.1  tsutsui 			do {
    780  1.1  tsutsui 				while (--xs->timeout) {
    781  1.1  tsutsui 					DELAY(1000);
    782  1.1  tsutsui 					if (bus_space_read_2(iot, ioh,
    783  1.1  tsutsui 					    TRM_SCSI_STATUS) & SCSIINTERRUPT)
    784  1.1  tsutsui 						break;
    785  1.1  tsutsui 				}
    786  1.1  tsutsui 				if (xs->timeout == 0) {
    787  1.1  tsutsui 					trm_timeout(srb);
    788  1.1  tsutsui 					break;
    789  1.1  tsutsui 				} else
    790  1.1  tsutsui 					trm_intr(sc);
    791  1.1  tsutsui 			} while ((xs->xs_status & XS_STS_DONE) == 0);
    792  1.1  tsutsui 			splx(s);
    793  1.1  tsutsui 		}
    794  1.1  tsutsui 		return;
    795  1.1  tsutsui 
    796  1.1  tsutsui 	case ADAPTER_REQ_GROW_RESOURCES:
    797  1.1  tsutsui 		/* XXX Not supported. */
    798  1.1  tsutsui 		return;
    799  1.1  tsutsui 
    800  1.1  tsutsui 	case ADAPTER_REQ_SET_XFER_MODE:
    801  1.1  tsutsui 		/* XXX XXX XXX */
    802  1.1  tsutsui 		return;
    803  1.1  tsutsui 	}
    804  1.1  tsutsui }
    805  1.1  tsutsui 
    806  1.1  tsutsui static void
    807  1.1  tsutsui trm_reset_device(sc)
    808  1.1  tsutsui 	struct trm_softc *sc;
    809  1.1  tsutsui {
    810  1.1  tsutsui 	struct trm_dcb *dcb, *pdcb;
    811  1.1  tsutsui 	struct trm_nvram *eeprom;
    812  1.1  tsutsui 	int index;
    813  1.1  tsutsui 
    814  1.1  tsutsui 	dcb = sc->sc_linkdcb;
    815  1.1  tsutsui 	if (dcb == NULL)
    816  1.1  tsutsui 		return;
    817  1.1  tsutsui 
    818  1.1  tsutsui 	pdcb = dcb;
    819  1.1  tsutsui 	do {
    820  1.1  tsutsui 		dcb->mode &= ~(SYNC_NEGO_DONE | WIDE_NEGO_DONE);
    821  1.1  tsutsui 		dcb->synctl = 0;
    822  1.1  tsutsui 		dcb->offset = 0;
    823  1.1  tsutsui 		eeprom = &sc->sc_eeprom;
    824  1.1  tsutsui 		dcb->tacfg = eeprom->target[dcb->id].config0;
    825  1.1  tsutsui 		index = eeprom->target[dcb->id].period & 0x07;
    826  1.1  tsutsui 		dcb->period = trm_clock_period[index];
    827  1.1  tsutsui 		if ((dcb->tacfg & NTC_DO_WIDE_NEGO) &&
    828  1.1  tsutsui 		    (sc->sc_config & HCC_WIDE_CARD))
    829  1.1  tsutsui 			dcb->mode |= WIDE_NEGO_ENABLE;
    830  1.1  tsutsui 
    831  1.1  tsutsui 		dcb = dcb->next;
    832  1.1  tsutsui 	}
    833  1.1  tsutsui 	while (pdcb != dcb);
    834  1.1  tsutsui }
    835  1.1  tsutsui 
    836  1.1  tsutsui static void
    837  1.1  tsutsui trm_recover_srb(sc)
    838  1.1  tsutsui 	struct trm_softc *sc;
    839  1.1  tsutsui {
    840  1.1  tsutsui 	struct trm_dcb *dcb, *pdcb;
    841  1.1  tsutsui 	struct trm_srb *psrb, *psrb2;
    842  1.1  tsutsui 	int i;
    843  1.1  tsutsui 
    844  1.1  tsutsui 	dcb = sc->sc_linkdcb;
    845  1.1  tsutsui 	if (dcb == NULL)
    846  1.1  tsutsui 		return;
    847  1.1  tsutsui 
    848  1.1  tsutsui 	pdcb = dcb;
    849  1.1  tsutsui 	do {
    850  1.1  tsutsui 		psrb = pdcb->gosrb;
    851  1.1  tsutsui 		for (i = 0; i < pdcb->gosrb_cnt; i++) {
    852  1.1  tsutsui 			psrb2 = psrb;
    853  1.1  tsutsui 			psrb = psrb->next;
    854  1.1  tsutsui 			if (pdcb->waitsrb) {
    855  1.1  tsutsui 				psrb2->next = pdcb->waitsrb;
    856  1.1  tsutsui 				pdcb->waitsrb = psrb2;
    857  1.1  tsutsui 			} else {
    858  1.1  tsutsui 				pdcb->waitsrb = psrb2;
    859  1.1  tsutsui 				pdcb->last_waitsrb = psrb2;
    860  1.1  tsutsui 				psrb2->next = NULL;
    861  1.1  tsutsui 			}
    862  1.1  tsutsui 		}
    863  1.1  tsutsui 		pdcb->gosrb_cnt = 0;
    864  1.1  tsutsui 		pdcb->gosrb = NULL;
    865  1.1  tsutsui 		pdcb->tagmask = 0;
    866  1.1  tsutsui 		pdcb = pdcb->next;
    867  1.1  tsutsui 	}
    868  1.1  tsutsui 	while (pdcb != dcb);
    869  1.1  tsutsui }
    870  1.1  tsutsui 
    871  1.1  tsutsui /*
    872  1.1  tsutsui  * perform a hard reset on the SCSI bus (and TRM_S1040 chip).
    873  1.1  tsutsui  */
    874  1.1  tsutsui static void
    875  1.1  tsutsui trm_reset(sc)
    876  1.1  tsutsui 	struct trm_softc *sc;
    877  1.1  tsutsui {
    878  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
    879  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
    880  1.1  tsutsui 	int s;
    881  1.1  tsutsui 
    882  1.1  tsutsui #ifdef TRM_DEBUG
    883  1.1  tsutsui 	printf("%s: SCSI RESET.........", sc->sc_dev.dv_xname);
    884  1.1  tsutsui #endif
    885  1.1  tsutsui 	s = splbio();
    886  1.1  tsutsui 
    887  1.1  tsutsui 	/* disable SCSI and DMA interrupt */
    888  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_INTEN, 0);
    889  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 0);
    890  1.1  tsutsui 
    891  1.1  tsutsui 	trm_reset_scsi_bus(sc);
    892  1.1  tsutsui 	DELAY(500000);
    893  1.1  tsutsui 
    894  1.1  tsutsui 	/* Enable SCSI interrupt */
    895  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_INTEN,
    896  1.1  tsutsui 	    EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED |
    897  1.1  tsutsui 	    EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE);
    898  1.1  tsutsui 
    899  1.1  tsutsui 	/* Enable DMA interrupt */
    900  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_INTEN, EN_SCSIINTR);
    901  1.1  tsutsui 
    902  1.1  tsutsui 	/* Clear DMA FIFO */
    903  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO);
    904  1.1  tsutsui 
    905  1.1  tsutsui 	/* Clear SCSI FIFO */
    906  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO);
    907  1.1  tsutsui 
    908  1.1  tsutsui 	trm_reset_device(sc);
    909  1.1  tsutsui 	trm_doing_srb_done(sc);
    910  1.1  tsutsui 	sc->sc_actdcb = NULL;
    911  1.1  tsutsui 	sc->sc_flag = 0;	/* RESET_DETECT, RESET_DONE, RESET_DEV */
    912  1.1  tsutsui 	trm_wait_srb(sc);
    913  1.1  tsutsui 
    914  1.1  tsutsui 	splx(s);
    915  1.1  tsutsui }
    916  1.1  tsutsui 
    917  1.1  tsutsui static void
    918  1.1  tsutsui trm_timeout(arg)
    919  1.1  tsutsui 	void *arg;
    920  1.1  tsutsui {
    921  1.1  tsutsui 	struct trm_srb *srb = (struct trm_srb *)arg;
    922  1.1  tsutsui 	struct scsipi_xfer *xs = srb->xs;
    923  1.1  tsutsui 	struct scsipi_periph *periph = xs->xs_periph;
    924  1.1  tsutsui 	struct trm_softc *sc;
    925  1.1  tsutsui 	int s;
    926  1.1  tsutsui 
    927  1.1  tsutsui 	if (xs == NULL)
    928  1.1  tsutsui 		printf("trm_timeout called with xs == NULL\n");
    929  1.1  tsutsui 
    930  1.1  tsutsui 	else {
    931  1.1  tsutsui 		scsipi_printaddr(xs->xs_periph);
    932  1.1  tsutsui 		printf("SCSI OpCode 0x%02x timed out\n", xs->cmd->opcode);
    933  1.1  tsutsui 	}
    934  1.1  tsutsui 
    935  1.1  tsutsui 	sc = (void *)periph->periph_channel->chan_adapter->adapt_dev;
    936  1.1  tsutsui 
    937  1.1  tsutsui 	s = splbio();
    938  1.1  tsutsui 	trm_reset_scsi_bus(sc);
    939  1.1  tsutsui 	callout_stop(&xs->xs_callout);
    940  1.1  tsutsui 	splx(s);
    941  1.1  tsutsui }
    942  1.1  tsutsui 
    943  1.1  tsutsui static int
    944  1.1  tsutsui trm_start_scsi(sc, dcb, srb)
    945  1.1  tsutsui 	struct trm_softc *sc;
    946  1.1  tsutsui 	struct trm_dcb *dcb;
    947  1.1  tsutsui 	struct trm_srb *srb;
    948  1.1  tsutsui {
    949  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
    950  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
    951  1.1  tsutsui 	int tagnum;
    952  1.1  tsutsui 	u_int32_t tagmask;
    953  1.1  tsutsui 	u_int8_t scsicmd, idmsg;
    954  1.1  tsutsui 
    955  1.1  tsutsui 	srb->tagnum = 31;
    956  1.1  tsutsui 
    957  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id);
    958  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_TARGETID, dcb->id);
    959  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_SYNC, dcb->synctl);
    960  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, dcb->offset);
    961  1.1  tsutsui 	srb->phase = PH_BUS_FREE;	/* initial phase */
    962  1.1  tsutsui 	/* Flush FIFO */
    963  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO);
    964  1.1  tsutsui 
    965  1.1  tsutsui 	idmsg = dcb->idmsg;
    966  1.1  tsutsui 
    967  1.1  tsutsui 	if ((srb->cmd[0] == INQUIRY) ||
    968  1.1  tsutsui 	    (srb->cmd[0] == REQUEST_SENSE) ||
    969  1.1  tsutsui 	    (srb->flag & AUTO_REQSENSE)) {
    970  1.1  tsutsui 		if (((dcb->mode & WIDE_NEGO_ENABLE) &&
    971  1.1  tsutsui 		     (dcb->mode & WIDE_NEGO_DONE) == 0) ||
    972  1.1  tsutsui 		    ((dcb->mode & SYNC_NEGO_ENABLE) &&
    973  1.1  tsutsui 		     (dcb->mode & SYNC_NEGO_DONE) == 0)) {
    974  1.1  tsutsui 			if ((dcb->idmsg & 7) == 0 || srb->cmd[0] != INQUIRY) {
    975  1.1  tsutsui 				scsicmd = SCMD_SEL_ATNSTOP;
    976  1.1  tsutsui 				srb->state = SRB_MSGOUT;
    977  1.1  tsutsui 				goto polling;
    978  1.1  tsutsui 			}
    979  1.1  tsutsui 		}
    980  1.1  tsutsui 		/* Send identify message */
    981  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
    982  1.1  tsutsui 		    idmsg & ~MSG_IDENTIFY_DISCFLAG);
    983  1.1  tsutsui 		scsicmd = SCMD_SEL_ATN;
    984  1.1  tsutsui 		srb->state = SRB_START_;
    985  1.1  tsutsui 	} else { /* not inquiry,request sense,auto request sense */
    986  1.1  tsutsui 		/* Send identify message */
    987  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, idmsg);
    988  1.1  tsutsui 		DELAY(30);
    989  1.1  tsutsui 		scsicmd = SCMD_SEL_ATN;
    990  1.1  tsutsui 		srb->state = SRB_START_;
    991  1.1  tsutsui 		if (dcb->mode & EN_TAG_QUEUING) {
    992  1.1  tsutsui 			/* Send Tag message, get tag id */
    993  1.1  tsutsui 			tagmask = 1;
    994  1.1  tsutsui 			tagnum = 0;
    995  1.1  tsutsui 			while (tagmask & dcb->tagmask) {
    996  1.1  tsutsui 				tagmask = tagmask << 1;
    997  1.1  tsutsui 				tagnum++;
    998  1.1  tsutsui 			}
    999  1.1  tsutsui 			/* Send Tag id */
   1000  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1001  1.1  tsutsui 			    MSG_SIMPLE_Q_TAG);
   1002  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, tagnum);
   1003  1.1  tsutsui 
   1004  1.1  tsutsui 			dcb->tagmask |= tagmask;
   1005  1.1  tsutsui 			srb->tagnum = tagnum;
   1006  1.1  tsutsui 
   1007  1.1  tsutsui 			scsicmd = SCMD_SEL_ATN3;
   1008  1.1  tsutsui 			srb->state = SRB_START_;
   1009  1.1  tsutsui 		}
   1010  1.1  tsutsui 	}
   1011  1.1  tsutsui polling:
   1012  1.1  tsutsui 	/*
   1013  1.1  tsutsui 	 * Send CDB ..command block...
   1014  1.1  tsutsui 	 */
   1015  1.1  tsutsui 	if (srb->flag & AUTO_REQSENSE) {
   1016  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, REQUEST_SENSE);
   1017  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1018  1.1  tsutsui 		    dcb->idmsg << SCSI_CMD_LUN_SHIFT);
   1019  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1020  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1021  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1022  1.1  tsutsui 		    sizeof(struct scsipi_sense_data));
   1023  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1024  1.1  tsutsui 	} else
   1025  1.1  tsutsui 		bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO,
   1026  1.1  tsutsui 		    srb->cmd, srb->cmdlen);
   1027  1.1  tsutsui 
   1028  1.1  tsutsui 	if (bus_space_read_2(iot, ioh, TRM_SCSI_STATUS) & SCSIINTERRUPT) {
   1029  1.1  tsutsui 		/*
   1030  1.1  tsutsui 		 * If trm_start_scsi return 1: current interrupt status
   1031  1.1  tsutsui 		 * is interrupt disreenable.  It's said that SCSI processor
   1032  1.1  tsutsui 		 * has more one SRB need to do, SCSI processor has been
   1033  1.1  tsutsui 		 * occupied by one SRB.
   1034  1.1  tsutsui 		 */
   1035  1.1  tsutsui 		srb->state = SRB_READY;
   1036  1.1  tsutsui 		dcb->tagmask &= ~(1 << srb->tagnum);
   1037  1.1  tsutsui 		return (1);
   1038  1.1  tsutsui 	} else {
   1039  1.1  tsutsui 		/*
   1040  1.1  tsutsui 		 * If trm_start_scsi return 0: current interrupt status
   1041  1.1  tsutsui 		 * is interrupt enable.  It's said that SCSI processor is
   1042  1.1  tsutsui 		 * unoccupied.
   1043  1.1  tsutsui 		 */
   1044  1.1  tsutsui 		srb->phase = PH_BUS_FREE;	/* SCSI bus free Phase */
   1045  1.1  tsutsui 		sc->sc_actdcb = dcb;
   1046  1.1  tsutsui 		dcb->actsrb = srb;
   1047  1.1  tsutsui 		bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1048  1.1  tsutsui 		    DO_DATALATCH | DO_HWRESELECT);
   1049  1.1  tsutsui 		/* it's important for atn stop */
   1050  1.1  tsutsui 		/*
   1051  1.1  tsutsui 		 * SCSI command
   1052  1.1  tsutsui 		 */
   1053  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, scsicmd);
   1054  1.1  tsutsui 		return (0);
   1055  1.1  tsutsui 	}
   1056  1.1  tsutsui }
   1057  1.1  tsutsui 
   1058  1.1  tsutsui /*
   1059  1.1  tsutsui  * Catch an interrupt from the adapter
   1060  1.1  tsutsui  * Process pending device interrupts.
   1061  1.1  tsutsui  */
   1062  1.1  tsutsui static int
   1063  1.1  tsutsui trm_intr(vsc)
   1064  1.1  tsutsui 	void *vsc;
   1065  1.1  tsutsui {
   1066  1.1  tsutsui 	bus_space_tag_t iot;
   1067  1.1  tsutsui 	bus_space_handle_t ioh;
   1068  1.1  tsutsui 	struct trm_softc *sc;
   1069  1.1  tsutsui 	struct trm_dcb *dcb;
   1070  1.1  tsutsui 	struct trm_srb *srb;
   1071  1.1  tsutsui 	void (*state_v) (struct trm_softc *, struct trm_srb *, int *);
   1072  1.1  tsutsui 	int phase, intstat, stat = 0;
   1073  1.1  tsutsui 
   1074  1.1  tsutsui #ifdef TRM_DEBUG
   1075  1.1  tsutsui 	printf("trm_intr......\n");
   1076  1.1  tsutsui #endif
   1077  1.1  tsutsui 	sc = (struct trm_softc *)vsc;
   1078  1.1  tsutsui 	iot = sc->sc_iot;
   1079  1.1  tsutsui 	ioh = sc->sc_ioh;
   1080  1.1  tsutsui 
   1081  1.1  tsutsui 	if (sc == NULL)
   1082  1.1  tsutsui 		return (0);
   1083  1.1  tsutsui 
   1084  1.1  tsutsui 	stat = bus_space_read_2(iot, ioh, TRM_SCSI_STATUS);
   1085  1.1  tsutsui 	if ((stat & SCSIINTERRUPT) == 0)
   1086  1.1  tsutsui 		return (0);
   1087  1.1  tsutsui 
   1088  1.1  tsutsui #ifdef TRM_DEBUG
   1089  1.1  tsutsui 	printf("stat=%2x,", stat);
   1090  1.1  tsutsui #endif
   1091  1.1  tsutsui 	intstat = bus_space_read_1(iot, ioh, TRM_SCSI_INTSTATUS);
   1092  1.1  tsutsui 
   1093  1.1  tsutsui #ifdef TRM_DEBUG
   1094  1.1  tsutsui 	printf("intstat=%2x,", intstat);
   1095  1.1  tsutsui #endif
   1096  1.1  tsutsui 	if (intstat & (INT_SELTIMEOUT | INT_DISCONNECT)) {
   1097  1.1  tsutsui 		trm_disconnect(sc);
   1098  1.1  tsutsui 		return (1);
   1099  1.1  tsutsui 	}
   1100  1.1  tsutsui 	if (intstat & INT_RESELECTED) {
   1101  1.1  tsutsui 		trm_reselect(sc);
   1102  1.1  tsutsui 		return (1);
   1103  1.1  tsutsui 	}
   1104  1.1  tsutsui 	if (intstat & INT_SCSIRESET) {
   1105  1.1  tsutsui 		trm_scsi_reset_detect(sc);
   1106  1.1  tsutsui 		return (1);
   1107  1.1  tsutsui 	}
   1108  1.1  tsutsui 	if (intstat & (INT_BUSSERVICE | INT_CMDDONE)) {
   1109  1.1  tsutsui 		dcb = sc->sc_actdcb;
   1110  1.1  tsutsui 		srb = dcb->actsrb;
   1111  1.1  tsutsui 		if (dcb != NULL)
   1112  1.1  tsutsui 			if (dcb->flag & ABORT_DEV_) {
   1113  1.1  tsutsui 				srb->msgout[0] = MSG_ABORT;
   1114  1.1  tsutsui 				trm_msgout_abort(sc, srb);
   1115  1.1  tsutsui 			}
   1116  1.1  tsutsui 		/*
   1117  1.1  tsutsui 		 * software sequential machine
   1118  1.1  tsutsui 		 */
   1119  1.1  tsutsui 		phase = srb->phase;	/* phase: */
   1120  1.1  tsutsui 
   1121  1.1  tsutsui 		/*
   1122  1.1  tsutsui 		 * 62037 or 62137 call  trm_scsi_phase0[]... "phase
   1123  1.1  tsutsui 		 * entry" handle every phase before start transfer
   1124  1.1  tsutsui 		 */
   1125  1.1  tsutsui 		state_v = (void *)trm_scsi_phase0[phase];
   1126  1.1  tsutsui 		state_v(sc, srb, &stat);
   1127  1.1  tsutsui 
   1128  1.1  tsutsui 		/*
   1129  1.1  tsutsui 		 *        if there were any exception occured
   1130  1.1  tsutsui 		 * stat will be modify to bus free phase new
   1131  1.1  tsutsui 		 * stat transfer out from ... prvious state_v
   1132  1.1  tsutsui 		 *
   1133  1.1  tsutsui 		 */
   1134  1.1  tsutsui 		/* phase:0,1,2,3,4,5,6,7 */
   1135  1.1  tsutsui 		srb->phase = stat & PHASEMASK;
   1136  1.1  tsutsui 		phase = stat & PHASEMASK;
   1137  1.1  tsutsui 
   1138  1.1  tsutsui 		/*
   1139  1.1  tsutsui 		 * call  trm_scsi_phase1[]... "phase entry" handle every
   1140  1.1  tsutsui 		 * phase do transfer
   1141  1.1  tsutsui 		 */
   1142  1.1  tsutsui 		state_v = (void *)trm_scsi_phase1[phase];
   1143  1.1  tsutsui 		state_v(sc, srb, &stat);
   1144  1.1  tsutsui 		return (1);
   1145  1.1  tsutsui 	}
   1146  1.1  tsutsui 	return (0);
   1147  1.1  tsutsui }
   1148  1.1  tsutsui 
   1149  1.1  tsutsui static void
   1150  1.1  tsutsui trm_msgout_phase0(sc, srb, pstat)
   1151  1.1  tsutsui 	struct trm_softc *sc;
   1152  1.1  tsutsui 	struct trm_srb *srb;
   1153  1.1  tsutsui 	int *pstat;
   1154  1.1  tsutsui {
   1155  1.1  tsutsui 
   1156  1.1  tsutsui 	if (srb->state & (SRB_UNEXPECT_RESEL | SRB_ABORT_SENT))
   1157  1.1  tsutsui 		*pstat = PH_BUS_FREE;	/* .. initial phase */
   1158  1.1  tsutsui }
   1159  1.1  tsutsui 
   1160  1.1  tsutsui static void
   1161  1.1  tsutsui trm_msgout_phase1(sc, srb, pstat)
   1162  1.1  tsutsui 	struct trm_softc *sc;
   1163  1.1  tsutsui 	struct trm_srb *srb;
   1164  1.1  tsutsui 	int *pstat;
   1165  1.1  tsutsui {
   1166  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1167  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1168  1.1  tsutsui 	struct trm_dcb *dcb;
   1169  1.1  tsutsui 
   1170  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO);
   1171  1.1  tsutsui 	dcb = sc->sc_actdcb;
   1172  1.1  tsutsui 	if ((srb->state & SRB_MSGOUT) == 0) {
   1173  1.1  tsutsui 		if (srb->msgcnt > 0) {
   1174  1.1  tsutsui 			bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO,
   1175  1.1  tsutsui 			    srb->msgout, srb->msgcnt);
   1176  1.1  tsutsui 			srb->msgcnt = 0;
   1177  1.1  tsutsui 			if ((dcb->flag & ABORT_DEV_) &&
   1178  1.1  tsutsui 			    (srb->msgout[0] == MSG_ABORT))
   1179  1.1  tsutsui 				srb->state = SRB_ABORT_SENT;
   1180  1.1  tsutsui 		} else {
   1181  1.1  tsutsui 			if ((srb->cmd[0] == INQUIRY) ||
   1182  1.1  tsutsui 			    (srb->cmd[0] == REQUEST_SENSE) ||
   1183  1.1  tsutsui 			    (srb->flag & AUTO_REQSENSE))
   1184  1.1  tsutsui 				if (dcb->mode & SYNC_NEGO_ENABLE)
   1185  1.1  tsutsui 					goto mop1;
   1186  1.1  tsutsui 
   1187  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, MSG_ABORT);
   1188  1.1  tsutsui 		}
   1189  1.1  tsutsui 	} else {
   1190  1.1  tsutsui mop1:		/* message out phase */
   1191  1.1  tsutsui 		if ((srb->state & SRB_DO_WIDE_NEGO) == 0 &&
   1192  1.1  tsutsui 		    (dcb->mode & WIDE_NEGO_ENABLE)) {
   1193  1.1  tsutsui 			/*
   1194  1.1  tsutsui 			 * WIDE DATA TRANSFER REQUEST code (03h)
   1195  1.1  tsutsui 			 */
   1196  1.1  tsutsui 			dcb->mode &= ~(SYNC_NEGO_DONE | EN_ATN_STOP);
   1197  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1198  1.1  tsutsui 			    dcb->idmsg & ~MSG_IDENTIFY_DISCFLAG);
   1199  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1200  1.1  tsutsui 			    MSG_EXTENDED); /* (01h) */
   1201  1.1  tsutsui 
   1202  1.1  tsutsui 			/* Message length (02h) */
   1203  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1204  1.1  tsutsui 			    MSG_EXT_WDTR_LEN);
   1205  1.1  tsutsui 
   1206  1.1  tsutsui 			/* wide data xfer (03h) */
   1207  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1208  1.1  tsutsui 			    MSG_EXT_WDTR);
   1209  1.1  tsutsui 
   1210  1.1  tsutsui 			/* width: 0(8bit), 1(16bit) ,2(32bit) */
   1211  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1212  1.1  tsutsui 			    MSG_EXT_WDTR_BUS_16_BIT);
   1213  1.1  tsutsui 
   1214  1.1  tsutsui 			srb->state |= SRB_DO_WIDE_NEGO;
   1215  1.1  tsutsui 		} else if ((srb->state & SRB_DO_SYNC_NEGO) == 0 &&
   1216  1.1  tsutsui 			   (dcb->mode & SYNC_NEGO_ENABLE)) {
   1217  1.1  tsutsui 			/*
   1218  1.1  tsutsui 			 * SYNCHRONOUS DATA TRANSFER REQUEST code (01h)
   1219  1.1  tsutsui 			 */
   1220  1.1  tsutsui 			if ((dcb->mode & WIDE_NEGO_DONE) == 0)
   1221  1.1  tsutsui 				bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1222  1.1  tsutsui 				    dcb->idmsg & ~MSG_IDENTIFY_DISCFLAG);
   1223  1.1  tsutsui 
   1224  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1225  1.1  tsutsui 			    MSG_EXTENDED); /* (01h) */
   1226  1.1  tsutsui 
   1227  1.1  tsutsui 			/* Message length (03h) */
   1228  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1229  1.1  tsutsui 			    MSG_EXT_SDTR_LEN);
   1230  1.1  tsutsui 
   1231  1.1  tsutsui 			/* SYNCHRONOUS DATA TRANSFER REQUEST code (01h) */
   1232  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1233  1.1  tsutsui 			    MSG_EXT_SDTR);
   1234  1.1  tsutsui 
   1235  1.1  tsutsui 			/* Transfer peeriod factor */
   1236  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, dcb->period);
   1237  1.1  tsutsui 
   1238  1.1  tsutsui 			/* REQ/ACK offset */
   1239  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1240  1.1  tsutsui 			    SYNC_NEGO_OFFSET);
   1241  1.1  tsutsui 			srb->state |= SRB_DO_SYNC_NEGO;
   1242  1.1  tsutsui 		}
   1243  1.1  tsutsui 	}
   1244  1.1  tsutsui 	/* it's important for atn stop */
   1245  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1246  1.1  tsutsui 
   1247  1.1  tsutsui 	/*
   1248  1.1  tsutsui 	 * SCSI cammand
   1249  1.1  tsutsui 	 */
   1250  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_OUT);
   1251  1.1  tsutsui }
   1252  1.1  tsutsui 
   1253  1.1  tsutsui static void
   1254  1.1  tsutsui trm_command_phase0(sc, srb, pstat)
   1255  1.1  tsutsui 	struct trm_softc *sc;
   1256  1.1  tsutsui 	struct trm_srb *srb;
   1257  1.1  tsutsui 	int *pstat;
   1258  1.1  tsutsui {
   1259  1.1  tsutsui 
   1260  1.1  tsutsui }
   1261  1.1  tsutsui 
   1262  1.1  tsutsui static void
   1263  1.1  tsutsui trm_command_phase1(sc, srb, pstat)
   1264  1.1  tsutsui 	struct trm_softc *sc;
   1265  1.1  tsutsui 	struct trm_srb *srb;
   1266  1.1  tsutsui 	int *pstat;
   1267  1.1  tsutsui {
   1268  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1269  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1270  1.1  tsutsui 	struct trm_dcb *dcb;
   1271  1.1  tsutsui 
   1272  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRATN | DO_CLRFIFO);
   1273  1.1  tsutsui 	if (srb->flag & AUTO_REQSENSE) {
   1274  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, REQUEST_SENSE);
   1275  1.1  tsutsui 		dcb = sc->sc_actdcb;
   1276  1.1  tsutsui 		/* target id */
   1277  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1278  1.1  tsutsui 		    dcb->idmsg << SCSI_CMD_LUN_SHIFT);
   1279  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1280  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1281  1.1  tsutsui 		/* sizeof(struct scsi_sense_data) */
   1282  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO,
   1283  1.1  tsutsui 		    sizeof(struct scsipi_sense_data));
   1284  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_SCSI_FIFO, 0);
   1285  1.1  tsutsui 	} else
   1286  1.1  tsutsui 		bus_space_write_multi_1(iot, ioh, TRM_SCSI_FIFO,
   1287  1.1  tsutsui 		    srb->cmd, srb->cmdlen);
   1288  1.1  tsutsui 
   1289  1.1  tsutsui 	srb->state = SRB_COMMAND;
   1290  1.1  tsutsui 	/* it's important for atn stop */
   1291  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1292  1.1  tsutsui 
   1293  1.1  tsutsui 	/*
   1294  1.1  tsutsui 	 * SCSI cammand
   1295  1.1  tsutsui 	 */
   1296  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_OUT);
   1297  1.1  tsutsui }
   1298  1.1  tsutsui 
   1299  1.1  tsutsui static void
   1300  1.1  tsutsui trm_dataout_phase0(sc, srb, pstat)
   1301  1.1  tsutsui 	struct trm_softc *sc;
   1302  1.1  tsutsui 	struct trm_srb *srb;
   1303  1.1  tsutsui 	int *pstat;
   1304  1.1  tsutsui {
   1305  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1306  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1307  1.1  tsutsui 	struct trm_dcb *dcb;
   1308  1.1  tsutsui 	struct trm_sg_entry *sg;
   1309  1.1  tsutsui 	int sgindex;
   1310  1.1  tsutsui 	u_int32_t xferlen, leftcnt = 0;
   1311  1.1  tsutsui 
   1312  1.1  tsutsui 	dcb = srb->dcb;
   1313  1.1  tsutsui 
   1314  1.1  tsutsui 	if ((srb->state & SRB_XFERPAD) == 0) {
   1315  1.1  tsutsui 		if (*pstat & PARITYERROR)
   1316  1.1  tsutsui 			srb->srbstat |= PARITY_ERROR;
   1317  1.1  tsutsui 
   1318  1.1  tsutsui 		if ((*pstat & SCSIXFERDONE) == 0) {
   1319  1.1  tsutsui 			/*
   1320  1.1  tsutsui 			 * when data transfer from DMA FIFO to SCSI FIFO
   1321  1.1  tsutsui 			 * if there was some data left in SCSI FIFO
   1322  1.1  tsutsui 			 */
   1323  1.1  tsutsui 			leftcnt = bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT) &
   1324  1.1  tsutsui 			    SCSI_FIFOCNT_MASK;
   1325  1.1  tsutsui 			if (dcb->synctl & WIDE_SYNC)
   1326  1.1  tsutsui 				/*
   1327  1.1  tsutsui 				 * if WIDE scsi SCSI FIFOCNT unit is word
   1328  1.1  tsutsui 				 * so need to * 2
   1329  1.1  tsutsui 				 */
   1330  1.1  tsutsui 				leftcnt <<= 1;
   1331  1.1  tsutsui 		}
   1332  1.1  tsutsui 		/*
   1333  1.1  tsutsui 		 * caculate all the residue data that not yet tranfered
   1334  1.1  tsutsui 		 * SCSI transfer counter + left in SCSI FIFO data
   1335  1.1  tsutsui 		 *
   1336  1.1  tsutsui 		 * .....TRM_SCSI_XCNT (24bits)
   1337  1.1  tsutsui 		 * The counter always decrement by one for every SCSI
   1338  1.1  tsutsui 		 * byte transfer.
   1339  1.1  tsutsui 		 * .....TRM_SCSI_FIFOCNT ( 5bits)
   1340  1.1  tsutsui 		 * The counter is SCSI FIFO offset counter
   1341  1.1  tsutsui 		 */
   1342  1.1  tsutsui 		leftcnt += bus_space_read_4(iot, ioh, TRM_SCSI_XCNT);
   1343  1.1  tsutsui 		if (leftcnt == 1) {
   1344  1.1  tsutsui 			leftcnt = 0;
   1345  1.1  tsutsui 			bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1346  1.1  tsutsui 			    DO_CLRFIFO);
   1347  1.1  tsutsui 		}
   1348  1.1  tsutsui 		if ((leftcnt == 0) || (*pstat & SCSIXFERCNT_2_ZERO)) {
   1349  1.1  tsutsui 			while ((bus_space_read_1(iot, ioh, TRM_DMA_STATUS) &
   1350  1.1  tsutsui 			    DMAXFERCOMP) == 0)
   1351  1.1  tsutsui 				;
   1352  1.1  tsutsui 
   1353  1.1  tsutsui 			srb->buflen = 0;
   1354  1.1  tsutsui 		} else {	/* Update SG list */
   1355  1.1  tsutsui 			/*
   1356  1.1  tsutsui 			 * if transfer not yet complete
   1357  1.1  tsutsui 			 * there were some data residue in SCSI FIFO or
   1358  1.1  tsutsui 			 * SCSI transfer counter not empty
   1359  1.1  tsutsui 			 */
   1360  1.1  tsutsui 			if (srb->buflen != leftcnt) {
   1361  1.1  tsutsui 				/* data that had transferred length */
   1362  1.1  tsutsui 				xferlen = srb->buflen - leftcnt;
   1363  1.1  tsutsui 
   1364  1.1  tsutsui 				/* next time to be transferred length */
   1365  1.1  tsutsui 				srb->buflen = leftcnt;
   1366  1.1  tsutsui 
   1367  1.1  tsutsui 				/*
   1368  1.1  tsutsui 				 * parsing from last time disconnect sgindex
   1369  1.1  tsutsui 				 */
   1370  1.1  tsutsui 				sg = srb->sgentry + srb->sgindex;
   1371  1.1  tsutsui 				for (sgindex = srb->sgindex;
   1372  1.1  tsutsui 				     sgindex < srb->sgcnt;
   1373  1.1  tsutsui 				     sgindex++, sg++) {
   1374  1.1  tsutsui 					/*
   1375  1.1  tsutsui 					 * find last time which SG transfer
   1376  1.1  tsutsui 					 * be disconnect
   1377  1.1  tsutsui 					 */
   1378  1.1  tsutsui 					if (xferlen >= le32toh(sg->length))
   1379  1.1  tsutsui 						xferlen -= le32toh(sg->length);
   1380  1.1  tsutsui 					else {
   1381  1.1  tsutsui 						/*
   1382  1.1  tsutsui 						 * update last time
   1383  1.1  tsutsui 						 * disconnected SG list
   1384  1.1  tsutsui 						 */
   1385  1.1  tsutsui 					        /* residue data length  */
   1386  1.1  tsutsui 						sg->length = htole32(
   1387  1.1  tsutsui 						    le32toh(sg->length)
   1388  1.1  tsutsui 						    - xferlen);
   1389  1.1  tsutsui 						/* residue data pointer */
   1390  1.1  tsutsui 						sg->address = htole32(
   1391  1.1  tsutsui 						    le32toh(sg->address)
   1392  1.1  tsutsui 						    + xferlen);
   1393  1.1  tsutsui 						srb->sgindex = sgindex;
   1394  1.1  tsutsui 						break;
   1395  1.1  tsutsui 					}
   1396  1.1  tsutsui 				}
   1397  1.1  tsutsui 				bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap,
   1398  1.1  tsutsui 				    srb->sgoffset, TRM_SG_SIZE,
   1399  1.1  tsutsui 				    BUS_DMASYNC_PREWRITE);
   1400  1.1  tsutsui 			}
   1401  1.1  tsutsui 		}
   1402  1.1  tsutsui 	}
   1403  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, STOPDMAXFER);
   1404  1.1  tsutsui }
   1405  1.1  tsutsui 
   1406  1.1  tsutsui static void
   1407  1.1  tsutsui trm_dataout_phase1(sc, srb, pstat)
   1408  1.1  tsutsui 	struct trm_softc *sc;
   1409  1.1  tsutsui 	struct trm_srb *srb;
   1410  1.1  tsutsui 	int *pstat;
   1411  1.1  tsutsui {
   1412  1.1  tsutsui 
   1413  1.1  tsutsui 	/*
   1414  1.1  tsutsui 	 * do prepare befor transfer when data out phase
   1415  1.1  tsutsui 	 */
   1416  1.1  tsutsui 	trm_dataio_xfer(sc, srb, XFERDATAOUT);
   1417  1.1  tsutsui }
   1418  1.1  tsutsui 
   1419  1.1  tsutsui static void
   1420  1.1  tsutsui trm_datain_phase0(sc, srb, pstat)
   1421  1.1  tsutsui 	struct trm_softc *sc;
   1422  1.1  tsutsui 	struct trm_srb *srb;
   1423  1.1  tsutsui 	int *pstat;
   1424  1.1  tsutsui {
   1425  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1426  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1427  1.1  tsutsui 	struct trm_sg_entry *sg;
   1428  1.1  tsutsui 	int sgindex;
   1429  1.1  tsutsui 	u_int32_t xferlen, leftcnt = 0;
   1430  1.1  tsutsui 
   1431  1.1  tsutsui 	if ((srb->state & SRB_XFERPAD) == 0) {
   1432  1.1  tsutsui 		if (*pstat & PARITYERROR)
   1433  1.1  tsutsui 			srb->srbstat |= PARITY_ERROR;
   1434  1.1  tsutsui 
   1435  1.1  tsutsui 		leftcnt += bus_space_read_4(iot, ioh, TRM_SCSI_XCNT);
   1436  1.1  tsutsui 		if ((leftcnt == 0) || (*pstat & SCSIXFERCNT_2_ZERO)) {
   1437  1.1  tsutsui 			while ((bus_space_read_1(iot, ioh, TRM_DMA_STATUS) &
   1438  1.1  tsutsui 			    DMAXFERCOMP) == 0)
   1439  1.1  tsutsui 				;
   1440  1.1  tsutsui 
   1441  1.1  tsutsui 			srb->buflen = 0;
   1442  1.1  tsutsui 		} else {	/* phase changed */
   1443  1.1  tsutsui 			/*
   1444  1.1  tsutsui 			 * parsing the case:
   1445  1.1  tsutsui 			 * when a transfer not yet complete
   1446  1.1  tsutsui 			 * but be disconnected by uper layer
   1447  1.1  tsutsui 			 * if transfer not yet complete
   1448  1.1  tsutsui 			 * there were some data residue in SCSI FIFO or
   1449  1.1  tsutsui 			 * SCSI transfer counter not empty
   1450  1.1  tsutsui 			 */
   1451  1.1  tsutsui 			if (srb->buflen != leftcnt) {
   1452  1.1  tsutsui 				/*
   1453  1.1  tsutsui 				 * data that had transferred length
   1454  1.1  tsutsui 				 */
   1455  1.1  tsutsui 				xferlen = srb->buflen - leftcnt;
   1456  1.1  tsutsui 
   1457  1.1  tsutsui 				/*
   1458  1.1  tsutsui 				 * next time to be transferred length
   1459  1.1  tsutsui 				 */
   1460  1.1  tsutsui 				srb->buflen = leftcnt;
   1461  1.1  tsutsui 
   1462  1.1  tsutsui 				/*
   1463  1.1  tsutsui 				 * parsing from last time disconnect sgindex
   1464  1.1  tsutsui 				 */
   1465  1.1  tsutsui 				sg = srb->sgentry + srb->sgindex;
   1466  1.1  tsutsui 				for (sgindex = srb->sgindex;
   1467  1.1  tsutsui 				     sgindex < srb->sgcnt;
   1468  1.1  tsutsui 				     sgindex++, sg++) {
   1469  1.1  tsutsui 					/*
   1470  1.1  tsutsui 					 * find last time which SG transfer
   1471  1.1  tsutsui 					 * be disconnect
   1472  1.1  tsutsui 					 */
   1473  1.1  tsutsui 					if (xferlen >= le32toh(sg->length))
   1474  1.1  tsutsui 						xferlen -= le32toh(sg->length);
   1475  1.1  tsutsui 					else {
   1476  1.1  tsutsui 						/*
   1477  1.1  tsutsui 						 * update last time
   1478  1.1  tsutsui 						 * disconnected SG list
   1479  1.1  tsutsui 						 */
   1480  1.1  tsutsui 						/* residue data length  */
   1481  1.1  tsutsui 						sg->length = htole32(
   1482  1.1  tsutsui 						    le32toh(sg->length)
   1483  1.1  tsutsui 						    - xferlen);
   1484  1.1  tsutsui 						/* residue data pointer */
   1485  1.1  tsutsui 						sg->address = htole32(
   1486  1.1  tsutsui 						    le32toh(sg->address)
   1487  1.1  tsutsui 						    + xferlen);
   1488  1.1  tsutsui 						srb->sgindex = sgindex;
   1489  1.1  tsutsui 						break;
   1490  1.1  tsutsui 					}
   1491  1.1  tsutsui 				}
   1492  1.1  tsutsui 				bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap,
   1493  1.1  tsutsui 				    srb->sgoffset, TRM_SG_SIZE,
   1494  1.1  tsutsui 				    BUS_DMASYNC_PREWRITE);
   1495  1.1  tsutsui 			}
   1496  1.1  tsutsui 		}
   1497  1.1  tsutsui 	}
   1498  1.1  tsutsui }
   1499  1.1  tsutsui 
   1500  1.1  tsutsui static void
   1501  1.1  tsutsui trm_datain_phase1(sc, srb, pstat)
   1502  1.1  tsutsui 	struct trm_softc *sc;
   1503  1.1  tsutsui 	struct trm_srb *srb;
   1504  1.1  tsutsui 	int *pstat;
   1505  1.1  tsutsui {
   1506  1.1  tsutsui 
   1507  1.1  tsutsui 	/*
   1508  1.1  tsutsui 	 * do prepare befor transfer when data in phase
   1509  1.1  tsutsui 	 */
   1510  1.1  tsutsui 	trm_dataio_xfer(sc, srb, XFERDATAIN);
   1511  1.1  tsutsui }
   1512  1.1  tsutsui 
   1513  1.1  tsutsui static void
   1514  1.1  tsutsui trm_dataio_xfer(sc, srb, iodir)
   1515  1.1  tsutsui 	struct trm_softc *sc;
   1516  1.1  tsutsui 	struct trm_srb *srb;
   1517  1.1  tsutsui 	int iodir;
   1518  1.1  tsutsui {
   1519  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1520  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1521  1.1  tsutsui 	struct trm_dcb *dcb = srb->dcb;
   1522  1.1  tsutsui 
   1523  1.1  tsutsui 	if (srb->sgindex < srb->sgcnt) {
   1524  1.1  tsutsui 		if (srb->buflen > 0) {
   1525  1.1  tsutsui 			/*
   1526  1.1  tsutsui 			 * load what physical address of Scatter/Gather
   1527  1.1  tsutsui 			 * list table want to be transfer
   1528  1.1  tsutsui 			 */
   1529  1.1  tsutsui 			srb->state = SRB_DATA_XFER;
   1530  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_DMA_XHIGHADDR, 0);
   1531  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_DMA_XLOWADDR,
   1532  1.1  tsutsui 			    srb->sgaddr +
   1533  1.1  tsutsui 			    srb->sgindex * sizeof(struct trm_sg_entry));
   1534  1.1  tsutsui 			/*
   1535  1.1  tsutsui 			 * load how many bytes in the Scatter/Gather list table
   1536  1.1  tsutsui 			 */
   1537  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_DMA_XCNT,
   1538  1.1  tsutsui 			    (srb->sgcnt - srb->sgindex)
   1539  1.1  tsutsui 			    * sizeof(struct trm_sg_entry));
   1540  1.1  tsutsui 			/*
   1541  1.1  tsutsui 			 * load total xfer length (24bits) max value 16Mbyte
   1542  1.1  tsutsui 			 */
   1543  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, srb->buflen);
   1544  1.1  tsutsui 			/* Start DMA transfer */
   1545  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_DMA_COMMAND,
   1546  1.1  tsutsui 			    iodir | SGXFER);
   1547  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_DMA_CONTROL,
   1548  1.1  tsutsui 			    STARTDMAXFER);
   1549  1.1  tsutsui 
   1550  1.1  tsutsui 			/* Start SCSI transfer */
   1551  1.1  tsutsui 			/* it's important for atn stop */
   1552  1.1  tsutsui 			bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1553  1.1  tsutsui 			    DO_DATALATCH);
   1554  1.1  tsutsui 
   1555  1.1  tsutsui 			/*
   1556  1.1  tsutsui 			 * SCSI cammand
   1557  1.1  tsutsui 			 */
   1558  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND,
   1559  1.1  tsutsui 			    (iodir == XFERDATAOUT) ?
   1560  1.1  tsutsui 			    SCMD_DMA_OUT : SCMD_DMA_IN);
   1561  1.1  tsutsui 		} else {	/* xfer pad */
   1562  1.1  tsutsui 			if (srb->sgcnt) {
   1563  1.1  tsutsui 				srb->hastat = H_OVER_UNDER_RUN;
   1564  1.1  tsutsui 				srb->srbstat |= OVER_RUN;
   1565  1.1  tsutsui 			}
   1566  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_SCSI_XCNT,
   1567  1.1  tsutsui 			    (dcb->synctl & WIDE_SYNC) ? 2 : 1);
   1568  1.1  tsutsui 
   1569  1.1  tsutsui 			if (iodir == XFERDATAOUT)
   1570  1.1  tsutsui 				bus_space_write_2(iot, ioh, TRM_SCSI_FIFO, 0);
   1571  1.1  tsutsui 			else
   1572  1.1  tsutsui 				bus_space_read_2(iot, ioh, TRM_SCSI_FIFO);
   1573  1.1  tsutsui 
   1574  1.1  tsutsui 			srb->state |= SRB_XFERPAD;
   1575  1.1  tsutsui 			/* it's important for atn stop */
   1576  1.1  tsutsui 			bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1577  1.1  tsutsui 			    DO_DATALATCH);
   1578  1.1  tsutsui 
   1579  1.1  tsutsui 			/*
   1580  1.1  tsutsui 			 * SCSI cammand
   1581  1.1  tsutsui 			 */
   1582  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND,
   1583  1.1  tsutsui 			    (iodir == XFERDATAOUT) ?
   1584  1.1  tsutsui 			    SCMD_FIFO_OUT : SCMD_FIFO_IN);
   1585  1.1  tsutsui 		}
   1586  1.1  tsutsui 	}
   1587  1.1  tsutsui }
   1588  1.1  tsutsui 
   1589  1.1  tsutsui static void
   1590  1.1  tsutsui trm_status_phase0(sc, srb, pstat)
   1591  1.1  tsutsui 	struct trm_softc *sc;
   1592  1.1  tsutsui 	struct trm_srb *srb;
   1593  1.1  tsutsui 	int *pstat;
   1594  1.1  tsutsui {
   1595  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1596  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1597  1.1  tsutsui 
   1598  1.1  tsutsui 	srb->tastat = bus_space_read_1(iot, ioh, TRM_SCSI_FIFO);
   1599  1.1  tsutsui 	srb->state = SRB_COMPLETED;
   1600  1.1  tsutsui 	*pstat = PH_BUS_FREE;	/* .. initial phase */
   1601  1.1  tsutsui 	/* it's important for atn stop */
   1602  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1603  1.1  tsutsui 
   1604  1.1  tsutsui 	/*
   1605  1.1  tsutsui 	 * SCSI cammand
   1606  1.1  tsutsui 	 */
   1607  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT);
   1608  1.1  tsutsui }
   1609  1.1  tsutsui 
   1610  1.1  tsutsui static void
   1611  1.1  tsutsui trm_status_phase1(sc, srb, pstat)
   1612  1.1  tsutsui 	struct trm_softc *sc;
   1613  1.1  tsutsui 	struct trm_srb *srb;
   1614  1.1  tsutsui 	int *pstat;
   1615  1.1  tsutsui {
   1616  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1617  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1618  1.1  tsutsui 
   1619  1.1  tsutsui 	if (bus_space_read_1(iot, ioh, TRM_DMA_COMMAND) & XFERDATAIN) {
   1620  1.1  tsutsui 		if ((bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT)
   1621  1.1  tsutsui 		    & SCSI_FIFO_EMPTY) == 0)
   1622  1.1  tsutsui 			bus_space_write_2(iot, ioh,
   1623  1.1  tsutsui 			    TRM_SCSI_CONTROL, DO_CLRFIFO);
   1624  1.1  tsutsui 		if ((bus_space_read_1(iot, ioh, TRM_DMA_FIFOSTATUS)
   1625  1.1  tsutsui 		    & DMA_FIFO_EMPTY) == 0)
   1626  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO);
   1627  1.1  tsutsui 	} else {
   1628  1.1  tsutsui 		if ((bus_space_read_1(iot, ioh, TRM_DMA_FIFOSTATUS)
   1629  1.1  tsutsui 		    & DMA_FIFO_EMPTY) == 0)
   1630  1.1  tsutsui 			bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, CLRXFIFO);
   1631  1.1  tsutsui 		if ((bus_space_read_1(iot, ioh, TRM_SCSI_FIFOCNT)
   1632  1.1  tsutsui 		    & SCSI_FIFO_EMPTY) == 0)
   1633  1.1  tsutsui 			bus_space_write_2(iot, ioh,
   1634  1.1  tsutsui 			    TRM_SCSI_CONTROL, DO_CLRFIFO);
   1635  1.1  tsutsui 	}
   1636  1.1  tsutsui 	srb->state = SRB_STATUS;
   1637  1.1  tsutsui 	/* it's important for atn stop */
   1638  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1639  1.1  tsutsui 
   1640  1.1  tsutsui 	/*
   1641  1.1  tsutsui 	 * SCSI cammand
   1642  1.1  tsutsui 	 */
   1643  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_COMP);
   1644  1.1  tsutsui }
   1645  1.1  tsutsui 
   1646  1.1  tsutsui static void
   1647  1.1  tsutsui trm_msgin_phase0(sc, srb, pstat)
   1648  1.1  tsutsui 	struct trm_softc *sc;
   1649  1.1  tsutsui 	struct trm_srb *srb;
   1650  1.1  tsutsui 	int *pstat;
   1651  1.1  tsutsui {
   1652  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1653  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1654  1.1  tsutsui 	struct trm_dcb *dcb = sc->sc_actdcb;
   1655  1.1  tsutsui 	struct trm_srb *tempsrb;
   1656  1.1  tsutsui 	int syncxfer, tagid, index;
   1657  1.1  tsutsui 	u_int8_t msgin_code;
   1658  1.1  tsutsui 
   1659  1.1  tsutsui 	msgin_code = bus_space_read_1(iot, ioh, TRM_SCSI_FIFO);
   1660  1.1  tsutsui 	if ((srb->state & SRB_EXTEND_MSGIN) == 0) {
   1661  1.1  tsutsui 		if (msgin_code == MSG_DISCONNECT) {
   1662  1.1  tsutsui 			srb->state = SRB_DISCONNECT;
   1663  1.1  tsutsui 			goto min6;
   1664  1.1  tsutsui 		} else if (msgin_code == MSG_SAVEDATAPOINTER) {
   1665  1.1  tsutsui 			goto min6;
   1666  1.1  tsutsui 		} else if ((msgin_code == MSG_EXTENDED) ||
   1667  1.1  tsutsui 			   ((msgin_code >= MSG_SIMPLE_Q_TAG) &&
   1668  1.1  tsutsui 			    (msgin_code <= MSG_ORDERED_Q_TAG))) {
   1669  1.1  tsutsui 			srb->state |= SRB_EXTEND_MSGIN;
   1670  1.1  tsutsui 			/* extended message (01h) */
   1671  1.1  tsutsui 			srb->msgin[0] = msgin_code;
   1672  1.1  tsutsui 
   1673  1.1  tsutsui 			srb->msgcnt = 1;
   1674  1.1  tsutsui 			/* extended message length (n) */
   1675  1.1  tsutsui 			srb->msg = &srb->msgin[1];
   1676  1.1  tsutsui 
   1677  1.1  tsutsui 			goto min6;
   1678  1.1  tsutsui 		} else if (msgin_code == MSG_MESSAGE_REJECT) {
   1679  1.1  tsutsui 			/* Reject message */
   1680  1.1  tsutsui 			/* do wide nego reject */
   1681  1.1  tsutsui 			if (dcb->mode & WIDE_NEGO_ENABLE) {
   1682  1.1  tsutsui 				dcb = srb->dcb;
   1683  1.1  tsutsui 				dcb->mode |= WIDE_NEGO_DONE;
   1684  1.1  tsutsui 				dcb->mode &= ~(SYNC_NEGO_DONE | EN_ATN_STOP |
   1685  1.1  tsutsui 				    WIDE_NEGO_ENABLE);
   1686  1.1  tsutsui 				srb->state &= ~(SRB_DO_WIDE_NEGO | SRB_MSGIN);
   1687  1.1  tsutsui 				if ((dcb->mode & SYNC_NEGO_ENABLE) &&
   1688  1.1  tsutsui 				    (dcb->mode & SYNC_NEGO_DONE) == 0) {
   1689  1.1  tsutsui 					/* Set ATN, in case ATN was clear */
   1690  1.1  tsutsui 					srb->state |= SRB_MSGOUT;
   1691  1.1  tsutsui 					bus_space_write_2(iot, ioh,
   1692  1.1  tsutsui 					    TRM_SCSI_CONTROL, DO_SETATN);
   1693  1.1  tsutsui 				} else
   1694  1.1  tsutsui 					/* Clear ATN */
   1695  1.1  tsutsui 					bus_space_write_2(iot, ioh,
   1696  1.1  tsutsui 					    TRM_SCSI_CONTROL, DO_CLRATN);
   1697  1.1  tsutsui 			} else if (dcb->mode & SYNC_NEGO_ENABLE) {
   1698  1.1  tsutsui 				/* do sync nego reject */
   1699  1.1  tsutsui 				bus_space_write_2(iot, ioh,
   1700  1.1  tsutsui 				    TRM_SCSI_CONTROL, DO_CLRATN);
   1701  1.1  tsutsui 				if (srb->state & SRB_DO_SYNC_NEGO) {
   1702  1.1  tsutsui 					dcb = srb->dcb;
   1703  1.1  tsutsui 					dcb->mode &= ~(SYNC_NEGO_ENABLE |
   1704  1.1  tsutsui 					    SYNC_NEGO_DONE);
   1705  1.1  tsutsui 					dcb->synctl = 0;
   1706  1.1  tsutsui 					dcb->offset = 0;
   1707  1.1  tsutsui 					goto re_prog;
   1708  1.1  tsutsui 				}
   1709  1.1  tsutsui 			}
   1710  1.1  tsutsui 			goto min6;
   1711  1.1  tsutsui 		} else if (msgin_code == MSG_IGN_WIDE_RESIDUE) {
   1712  1.1  tsutsui 			bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, 1);
   1713  1.1  tsutsui 			bus_space_read_1(iot, ioh, TRM_SCSI_FIFO);
   1714  1.1  tsutsui 			goto min6;
   1715  1.1  tsutsui 		} else {
   1716  1.1  tsutsui 			/*
   1717  1.1  tsutsui 			 * Restore data pointer message
   1718  1.1  tsutsui 			 * Save data pointer message
   1719  1.1  tsutsui 			 * Completion message
   1720  1.1  tsutsui 			 * NOP message
   1721  1.1  tsutsui 			 */
   1722  1.1  tsutsui 			goto min6;
   1723  1.1  tsutsui 		}
   1724  1.1  tsutsui 	} else {
   1725  1.1  tsutsui 		/*
   1726  1.1  tsutsui 		 * when extend message in:srb->state = SRB_EXTEND_MSGIN
   1727  1.1  tsutsui 		 * Parsing incomming extented messages
   1728  1.1  tsutsui 		 */
   1729  1.1  tsutsui 		*srb->msg = msgin_code;
   1730  1.1  tsutsui 		srb->msgcnt++;
   1731  1.1  tsutsui 		srb->msg++;
   1732  1.1  tsutsui #ifdef TRM_DEBUG
   1733  1.1  tsutsui 		printf("srb->msgin[0]=%2x\n", srb->msgin[0]);
   1734  1.1  tsutsui 		printf("srb->msgin[1]=%2x\n", srb->msgin[1]);
   1735  1.1  tsutsui 		printf("srb->msgin[2]=%2x\n", srb->msgin[2]);
   1736  1.1  tsutsui 		printf("srb->msgin[3]=%2x\n", srb->msgin[3]);
   1737  1.1  tsutsui 		printf("srb->msgin[4]=%2x\n", srb->msgin[4]);
   1738  1.1  tsutsui #endif
   1739  1.1  tsutsui 		if ((srb->msgin[0] >= MSG_SIMPLE_Q_TAG) &&
   1740  1.1  tsutsui 		    (srb->msgin[0] <= MSG_ORDERED_Q_TAG)) {
   1741  1.1  tsutsui 			/*
   1742  1.1  tsutsui 			 * is QUEUE tag message :
   1743  1.1  tsutsui 			 *
   1744  1.1  tsutsui 			 * byte 0:
   1745  1.1  tsutsui 			 *        HEAD    QUEUE TAG (20h)
   1746  1.1  tsutsui 			 *        ORDERED QUEUE TAG (21h)
   1747  1.1  tsutsui 			 *        SIMPLE  QUEUE TAG (22h)
   1748  1.1  tsutsui 			 * byte 1:
   1749  1.1  tsutsui 			 *        Queue tag (00h - FFh)
   1750  1.1  tsutsui 			 */
   1751  1.1  tsutsui 			if (srb->msgcnt == 2) {
   1752  1.1  tsutsui 				srb->state = 0;
   1753  1.1  tsutsui 				tagid = srb->msgin[1];
   1754  1.1  tsutsui 				srb = dcb->gosrb;
   1755  1.1  tsutsui 				tempsrb = dcb->last_gosrb;
   1756  1.1  tsutsui 				if (srb) {
   1757  1.1  tsutsui 					for (;;) {
   1758  1.1  tsutsui 						if (srb->tagnum != tagid) {
   1759  1.1  tsutsui 							if (srb == tempsrb)
   1760  1.1  tsutsui 								goto mingx0;
   1761  1.1  tsutsui 
   1762  1.1  tsutsui 							srb = srb->next;
   1763  1.1  tsutsui 						} else
   1764  1.1  tsutsui 							break;
   1765  1.1  tsutsui 					}
   1766  1.1  tsutsui 					if (dcb->flag & ABORT_DEV_) {
   1767  1.1  tsutsui 						srb->state = SRB_ABORT_SENT;
   1768  1.1  tsutsui 						srb->msgout[0] = MSG_ABORT;
   1769  1.1  tsutsui 						trm_msgout_abort(sc, srb);
   1770  1.1  tsutsui 					}
   1771  1.1  tsutsui 					if ((srb->state & SRB_DISCONNECT) == 0)
   1772  1.1  tsutsui 						goto mingx0;
   1773  1.1  tsutsui 
   1774  1.1  tsutsui 					dcb->actsrb = srb;
   1775  1.1  tsutsui 					srb->state = SRB_DATA_XFER;
   1776  1.1  tsutsui 				} else {
   1777  1.1  tsutsui 			mingx0:
   1778  1.2  tsutsui 					srb = &sc->sc_tempsrb;
   1779  1.1  tsutsui 					srb->state = SRB_UNEXPECT_RESEL;
   1780  1.1  tsutsui 					dcb->actsrb = srb;
   1781  1.1  tsutsui 					srb->msgout[0] = MSG_ABORT_TAG;
   1782  1.1  tsutsui 					trm_msgout_abort(sc, srb);
   1783  1.1  tsutsui 				}
   1784  1.1  tsutsui 			}
   1785  1.1  tsutsui 		} else if ((srb->msgin[0] == MSG_EXTENDED) &&
   1786  1.1  tsutsui 			   (srb->msgin[2] == MSG_EXT_WDTR) &&
   1787  1.1  tsutsui 			   (srb->msgcnt == 4)) {
   1788  1.1  tsutsui 			/*
   1789  1.1  tsutsui 			 * is Wide data xfer Extended message :
   1790  1.1  tsutsui 			 * ======================================
   1791  1.1  tsutsui 			 * WIDE DATA TRANSFER REQUEST
   1792  1.1  tsutsui 			 * ======================================
   1793  1.1  tsutsui 			 * byte 0 :  Extended message (01h)
   1794  1.1  tsutsui 			 * byte 1 :  Extended message length (02h)
   1795  1.1  tsutsui 			 * byte 2 :  WIDE DATA TRANSFER code (03h)
   1796  1.1  tsutsui 			 * byte 3 :  Transfer width exponent
   1797  1.1  tsutsui 			 */
   1798  1.1  tsutsui 			dcb = srb->dcb;
   1799  1.1  tsutsui 			srb->state &= ~(SRB_EXTEND_MSGIN | SRB_DO_WIDE_NEGO);
   1800  1.1  tsutsui 			if ((srb->msgin[1] != MSG_EXT_WDTR_LEN)) {
   1801  1.1  tsutsui 				/* Length is wrong, reject it */
   1802  1.1  tsutsui 				dcb->mode &=
   1803  1.1  tsutsui 				    ~(WIDE_NEGO_ENABLE | WIDE_NEGO_DONE);
   1804  1.1  tsutsui 				srb->msgcnt = 1;
   1805  1.1  tsutsui 				srb->msgin[0] = MSG_MESSAGE_REJECT;
   1806  1.1  tsutsui 				bus_space_write_2(iot, ioh,
   1807  1.1  tsutsui 				    TRM_SCSI_CONTROL, DO_SETATN);
   1808  1.1  tsutsui 				goto min6;
   1809  1.1  tsutsui 			}
   1810  1.1  tsutsui 			if (dcb->mode & WIDE_NEGO_ENABLE) {
   1811  1.1  tsutsui 				/* Do wide negoniation */
   1812  1.1  tsutsui 				if (srb->msgin[3] > MSG_EXT_WDTR_BUS_32_BIT) {
   1813  1.1  tsutsui 					/* reject_msg: */
   1814  1.1  tsutsui 					dcb->mode &= ~(WIDE_NEGO_ENABLE |
   1815  1.1  tsutsui 					    WIDE_NEGO_DONE);
   1816  1.1  tsutsui 					srb->msgcnt = 1;
   1817  1.1  tsutsui 					srb->msgin[0] = MSG_MESSAGE_REJECT;
   1818  1.1  tsutsui 					bus_space_write_2(iot, ioh,
   1819  1.1  tsutsui 					    TRM_SCSI_CONTROL, DO_SETATN);
   1820  1.1  tsutsui 					goto min6;
   1821  1.1  tsutsui 				}
   1822  1.1  tsutsui 				if (srb->msgin[3] == MSG_EXT_WDTR_BUS_32_BIT)
   1823  1.1  tsutsui 					/* do 16 bits */
   1824  1.1  tsutsui 					srb->msgin[3] = MSG_EXT_WDTR_BUS_16_BIT;
   1825  1.1  tsutsui 				else {
   1826  1.1  tsutsui 					if ((dcb->mode & WIDE_NEGO_DONE) == 0) {
   1827  1.1  tsutsui 						srb->state &=
   1828  1.1  tsutsui 						    ~(SRB_DO_WIDE_NEGO |
   1829  1.1  tsutsui 						    SRB_MSGIN);
   1830  1.1  tsutsui 						dcb->mode |= WIDE_NEGO_DONE;
   1831  1.1  tsutsui 						dcb->mode &=
   1832  1.1  tsutsui 						    ~(SYNC_NEGO_DONE |
   1833  1.1  tsutsui 						    EN_ATN_STOP |
   1834  1.1  tsutsui 						    WIDE_NEGO_ENABLE);
   1835  1.1  tsutsui 						if (srb->msgin[3] !=
   1836  1.1  tsutsui 						    MSG_EXT_WDTR_BUS_8_BIT)
   1837  1.1  tsutsui 							/* is Wide data xfer */
   1838  1.1  tsutsui 							dcb->synctl |=
   1839  1.1  tsutsui 							    WIDE_SYNC;
   1840  1.1  tsutsui 					}
   1841  1.1  tsutsui 				}
   1842  1.1  tsutsui 			} else
   1843  1.1  tsutsui 				srb->msgin[3] = MSG_EXT_WDTR_BUS_8_BIT;
   1844  1.1  tsutsui 
   1845  1.1  tsutsui 			srb->state |= SRB_MSGOUT;
   1846  1.1  tsutsui 			bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1847  1.1  tsutsui 			    DO_SETATN);
   1848  1.1  tsutsui 			goto min6;
   1849  1.1  tsutsui 		} else if ((srb->msgin[0] == MSG_EXTENDED) &&
   1850  1.1  tsutsui 			   (srb->msgin[2] == MSG_EXT_SDTR) &&
   1851  1.1  tsutsui 			   (srb->msgcnt == 5)) {
   1852  1.1  tsutsui 			/*
   1853  1.1  tsutsui 			 * is 8bit transfer Extended message :
   1854  1.1  tsutsui 			 * =================================
   1855  1.1  tsutsui 			 * SYNCHRONOUS DATA TRANSFER REQUEST
   1856  1.1  tsutsui 			 * =================================
   1857  1.1  tsutsui 			 * byte 0 :  Extended message (01h)
   1858  1.1  tsutsui 			 * byte 1 :  Extended message length (03)
   1859  1.1  tsutsui 			 * byte 2 :  SYNCHRONOUS DATA TRANSFER code (01h)
   1860  1.1  tsutsui 			 * byte 3 :  Transfer period factor
   1861  1.1  tsutsui 			 * byte 4 :  REQ/ACK offset
   1862  1.1  tsutsui 			 */
   1863  1.1  tsutsui 			srb->state &= ~(SRB_EXTEND_MSGIN | SRB_DO_SYNC_NEGO);
   1864  1.1  tsutsui 			if (srb->msgin[1] != MSG_EXT_SDTR_LEN) {
   1865  1.1  tsutsui 				/* reject_msg: */
   1866  1.1  tsutsui 				srb->msgcnt = 1;
   1867  1.1  tsutsui 				srb->msgin[0] = MSG_MESSAGE_REJECT;
   1868  1.1  tsutsui 				bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   1869  1.1  tsutsui 				    DO_SETATN);
   1870  1.1  tsutsui 			} else if (srb->msgin[3] == 0 || srb->msgin[4] == 0) {
   1871  1.1  tsutsui 				/* set async */
   1872  1.1  tsutsui 				dcb = srb->dcb;
   1873  1.1  tsutsui 				/* disable sync & sync nego */
   1874  1.1  tsutsui 				dcb->mode &=
   1875  1.1  tsutsui 				    ~(SYNC_NEGO_ENABLE | SYNC_NEGO_DONE);
   1876  1.1  tsutsui 				dcb->synctl = 0;
   1877  1.1  tsutsui 				dcb->offset = 0;
   1878  1.1  tsutsui 				if (((dcb->flag & SHOW_MESSAGE_) == 0) &&
   1879  1.1  tsutsui 				    (dcb->lun == 0)) {
   1880  1.1  tsutsui 					printf("%s: target %d, Sync period=0 "
   1881  1.1  tsutsui 					    "or Sync offset=0 to be "
   1882  1.1  tsutsui 					    "asynchronous transfer\n",
   1883  1.1  tsutsui 					    sc->sc_dev.dv_xname, dcb->id);
   1884  1.1  tsutsui 					dcb->flag |= SHOW_MESSAGE_;
   1885  1.1  tsutsui 				}
   1886  1.1  tsutsui 				goto re_prog;
   1887  1.1  tsutsui 			} else { /* set sync */
   1888  1.1  tsutsui 				dcb = srb->dcb;
   1889  1.1  tsutsui 				dcb->mode |= SYNC_NEGO_ENABLE | SYNC_NEGO_DONE;
   1890  1.1  tsutsui 
   1891  1.1  tsutsui 				/* Transfer period factor */
   1892  1.1  tsutsui 				dcb->period = srb->msgin[3];
   1893  1.1  tsutsui 
   1894  1.1  tsutsui 				/* REQ/ACK offset */
   1895  1.1  tsutsui 				dcb->offset = srb->msgin[4];
   1896  1.1  tsutsui 				for (index = 0; index < 7; index++)
   1897  1.1  tsutsui 					if (srb->msgin[3] <=
   1898  1.1  tsutsui 					    trm_clock_period[index])
   1899  1.1  tsutsui 						break;
   1900  1.1  tsutsui 
   1901  1.1  tsutsui 				dcb->synctl |= (index | ALT_SYNC);
   1902  1.1  tsutsui 				/*
   1903  1.1  tsutsui 				 * show negotiation message
   1904  1.1  tsutsui 				 */
   1905  1.1  tsutsui 				if (((dcb->flag & SHOW_MESSAGE_) == 0) &&
   1906  1.1  tsutsui 				    (dcb->lun == 0)) {
   1907  1.1  tsutsui 					syncxfer = 100000 /
   1908  1.1  tsutsui 					    (trm_clock_period[index] * 4);
   1909  1.1  tsutsui 					if (dcb->synctl & WIDE_SYNC) {
   1910  1.1  tsutsui 						printf("%s: target %d, "
   1911  1.1  tsutsui 						    "16bits Wide transfer\n",
   1912  1.1  tsutsui 						    sc->sc_dev.dv_xname,
   1913  1.1  tsutsui 						    dcb->id);
   1914  1.1  tsutsui 						syncxfer = syncxfer * 2;
   1915  1.1  tsutsui 					} else
   1916  1.1  tsutsui 						printf("%s: target %d, "
   1917  1.1  tsutsui 						    "8bits Narrow transfer\n",
   1918  1.1  tsutsui 						    sc->sc_dev.dv_xname,
   1919  1.1  tsutsui 						    dcb->id);
   1920  1.1  tsutsui 
   1921  1.1  tsutsui 					printf("%s: target %d, "
   1922  1.1  tsutsui 					    "Sync transfer %d.%01d MB/sec, "
   1923  1.1  tsutsui 					    "Offset %d\n", sc->sc_dev.dv_xname,
   1924  1.1  tsutsui 					    dcb->id, syncxfer / 100,
   1925  1.1  tsutsui 					    syncxfer % 100, dcb->offset);
   1926  1.1  tsutsui 					dcb->flag |= SHOW_MESSAGE_;
   1927  1.1  tsutsui 				}
   1928  1.1  tsutsui 		re_prog:
   1929  1.1  tsutsui 				/*
   1930  1.1  tsutsui 				 * program SCSI control register
   1931  1.1  tsutsui 				 */
   1932  1.1  tsutsui 				bus_space_write_1(iot, ioh, TRM_SCSI_SYNC,
   1933  1.1  tsutsui 				    dcb->synctl);
   1934  1.1  tsutsui 				bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET,
   1935  1.1  tsutsui 				    dcb->offset);
   1936  1.1  tsutsui 				trm_set_xfer_rate(sc, srb, dcb);
   1937  1.1  tsutsui 			}
   1938  1.1  tsutsui 		}
   1939  1.1  tsutsui 	}
   1940  1.1  tsutsui min6:
   1941  1.1  tsutsui 	*pstat = PH_BUS_FREE; /* .. initial phase */
   1942  1.1  tsutsui 	/* it's important for atn stop */
   1943  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1944  1.1  tsutsui 
   1945  1.1  tsutsui 	/*
   1946  1.1  tsutsui 	 * SCSI cammand
   1947  1.1  tsutsui 	 */
   1948  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT);
   1949  1.1  tsutsui }
   1950  1.1  tsutsui 
   1951  1.1  tsutsui static void
   1952  1.1  tsutsui trm_msgin_phase1(sc, srb, pstat)
   1953  1.1  tsutsui 	struct trm_softc *sc;
   1954  1.1  tsutsui 	struct trm_srb *srb;
   1955  1.1  tsutsui 	int *pstat;
   1956  1.1  tsutsui {
   1957  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   1958  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   1959  1.1  tsutsui 
   1960  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO);
   1961  1.1  tsutsui 	bus_space_write_4(iot, ioh, TRM_SCSI_XCNT, 1);
   1962  1.1  tsutsui 	if ((srb->state & SRB_MSGIN) == 0) {
   1963  1.1  tsutsui 		srb->state &= SRB_DISCONNECT;
   1964  1.1  tsutsui 		srb->state |= SRB_MSGIN;
   1965  1.1  tsutsui 	}
   1966  1.1  tsutsui 	/* it's important for atn stop */
   1967  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   1968  1.1  tsutsui 
   1969  1.1  tsutsui 	/*
   1970  1.1  tsutsui 	 * SCSI cammand
   1971  1.1  tsutsui 	 */
   1972  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_FIFO_IN);
   1973  1.1  tsutsui }
   1974  1.1  tsutsui 
   1975  1.1  tsutsui static void
   1976  1.1  tsutsui trm_nop0(sc, srb, pstat)
   1977  1.1  tsutsui 	struct trm_softc *sc;
   1978  1.1  tsutsui 	struct trm_srb *srb;
   1979  1.1  tsutsui 	int *pstat;
   1980  1.1  tsutsui {
   1981  1.1  tsutsui 
   1982  1.1  tsutsui }
   1983  1.1  tsutsui 
   1984  1.1  tsutsui static void
   1985  1.1  tsutsui trm_nop1(sc, srb, pstat)
   1986  1.1  tsutsui 	struct trm_softc *sc;
   1987  1.1  tsutsui 	struct trm_srb *srb;
   1988  1.1  tsutsui 	int *pstat;
   1989  1.1  tsutsui {
   1990  1.1  tsutsui 
   1991  1.1  tsutsui }
   1992  1.1  tsutsui 
   1993  1.1  tsutsui static void
   1994  1.1  tsutsui trm_set_xfer_rate(sc, srb, dcb)
   1995  1.1  tsutsui 	struct trm_softc *sc;
   1996  1.1  tsutsui 	struct trm_srb *srb;
   1997  1.1  tsutsui 	struct trm_dcb *dcb;
   1998  1.1  tsutsui {
   1999  1.1  tsutsui 	struct trm_dcb *tempdcb;
   2000  1.1  tsutsui 	int i;
   2001  1.1  tsutsui 
   2002  1.1  tsutsui 	/*
   2003  1.1  tsutsui 	 * set all lun device's (period, offset)
   2004  1.1  tsutsui 	 */
   2005  1.1  tsutsui #ifdef TRM_DEBUG
   2006  1.1  tsutsui 	printf("trm_set_xfer_rate............\n");
   2007  1.1  tsutsui #endif
   2008  1.1  tsutsui 	if ((dcb->idmsg & 0x07) == 0) {
   2009  1.1  tsutsui 		if (sc->devscan_end == 0)
   2010  1.1  tsutsui 			sc->cur_offset = dcb->offset;
   2011  1.1  tsutsui 		else {
   2012  1.1  tsutsui 			tempdcb = sc->sc_linkdcb;
   2013  1.1  tsutsui 			for (i = 0; i < sc->devcnt; i++) {
   2014  1.1  tsutsui 				/*
   2015  1.1  tsutsui 				 * different LUN but had same target ID
   2016  1.1  tsutsui 				 */
   2017  1.1  tsutsui 				if (tempdcb->id == dcb->id) {
   2018  1.1  tsutsui 					tempdcb->synctl = dcb->synctl;
   2019  1.1  tsutsui 					tempdcb->offset = dcb->offset;
   2020  1.1  tsutsui 					tempdcb->mode = dcb->mode;
   2021  1.1  tsutsui 				}
   2022  1.1  tsutsui 				tempdcb = tempdcb->next;
   2023  1.1  tsutsui 			}
   2024  1.1  tsutsui 		}
   2025  1.1  tsutsui 	}
   2026  1.1  tsutsui }
   2027  1.1  tsutsui 
   2028  1.1  tsutsui static void
   2029  1.1  tsutsui trm_disconnect(sc)
   2030  1.1  tsutsui 	struct trm_softc *sc;
   2031  1.1  tsutsui {
   2032  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2033  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2034  1.1  tsutsui 	struct trm_dcb *dcb;
   2035  1.1  tsutsui 	struct trm_srb *srb, *psrb;
   2036  1.1  tsutsui 	int i, s;
   2037  1.1  tsutsui 
   2038  1.1  tsutsui #ifdef TRM_DEBUG
   2039  1.1  tsutsui 	printf("trm_disconnect...............\n");
   2040  1.1  tsutsui #endif
   2041  1.1  tsutsui 	s = splbio();
   2042  1.1  tsutsui 
   2043  1.1  tsutsui 	dcb = sc->sc_actdcb;
   2044  1.1  tsutsui 	if (dcb == NULL) {
   2045  1.1  tsutsui 		DELAY(1000);	/* 1 msec */
   2046  1.1  tsutsui 
   2047  1.1  tsutsui 		bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   2048  1.1  tsutsui 		    DO_CLRFIFO | DO_HWRESELECT);
   2049  1.1  tsutsui 		return;
   2050  1.1  tsutsui 	}
   2051  1.1  tsutsui 	srb = dcb->actsrb;
   2052  1.1  tsutsui 	sc->sc_actdcb = 0;
   2053  1.1  tsutsui 	srb->phase = PH_BUS_FREE;	/* SCSI bus free Phase */
   2054  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL,
   2055  1.1  tsutsui 	    DO_CLRFIFO | DO_HWRESELECT);
   2056  1.1  tsutsui 	DELAY(100);
   2057  1.1  tsutsui 	if (srb->state & SRB_UNEXPECT_RESEL) {
   2058  1.1  tsutsui 		srb->state = 0;
   2059  1.1  tsutsui 		trm_wait_srb(sc);
   2060  1.1  tsutsui 	} else if (srb->state & SRB_ABORT_SENT) {
   2061  1.1  tsutsui 		dcb->tagmask = 0;
   2062  1.1  tsutsui 		dcb->flag &= ~ABORT_DEV_;
   2063  1.1  tsutsui 		srb = dcb->gosrb;
   2064  1.1  tsutsui 		for (i = 0; i < dcb->gosrb_cnt; i++) {
   2065  1.1  tsutsui 			psrb = srb->next;
   2066  1.1  tsutsui 			srb->next = sc->sc_freesrb;
   2067  1.1  tsutsui 			sc->sc_freesrb = srb;
   2068  1.1  tsutsui 			srb = psrb;
   2069  1.1  tsutsui 		}
   2070  1.1  tsutsui 		dcb->gosrb_cnt = 0;
   2071  1.1  tsutsui 		dcb->gosrb = 0;
   2072  1.1  tsutsui 		trm_wait_srb(sc);
   2073  1.1  tsutsui 	} else {
   2074  1.1  tsutsui 		if ((srb->state & (SRB_START_ | SRB_MSGOUT)) ||
   2075  1.1  tsutsui 		    (srb->state & (SRB_DISCONNECT | SRB_COMPLETED)) == 0) {
   2076  1.1  tsutsui 				/* Selection time out */
   2077  1.1  tsutsui 			if (sc->devscan_end) {
   2078  1.1  tsutsui 				srb->state = SRB_READY;
   2079  1.1  tsutsui 				trm_rewait_srb(dcb, srb);
   2080  1.1  tsutsui 			} else {
   2081  1.1  tsutsui 				srb->tastat = SCSI_SEL_TIMEOUT;
   2082  1.1  tsutsui 				goto disc1;
   2083  1.1  tsutsui 			}
   2084  1.1  tsutsui 		} else if (srb->state & SRB_DISCONNECT) {
   2085  1.1  tsutsui 			/*
   2086  1.1  tsutsui 			 * SRB_DISCONNECT
   2087  1.1  tsutsui 			 */
   2088  1.1  tsutsui 			trm_wait_srb(sc);
   2089  1.1  tsutsui 		} else if (srb->state & SRB_COMPLETED) {
   2090  1.1  tsutsui 	disc1:
   2091  1.1  tsutsui 			/*
   2092  1.1  tsutsui 			 * SRB_COMPLETED
   2093  1.1  tsutsui 			 */
   2094  1.1  tsutsui 			if (dcb->maxcmd > 1) {
   2095  1.1  tsutsui 				/* free tag mask */
   2096  1.1  tsutsui 				dcb->tagmask &= ~(1 << srb->tagnum);
   2097  1.1  tsutsui 			}
   2098  1.1  tsutsui 			dcb->actsrb = 0;
   2099  1.1  tsutsui 			srb->state = SRB_FREE;
   2100  1.1  tsutsui 			trm_srb_done(sc, dcb, srb);
   2101  1.1  tsutsui 		}
   2102  1.1  tsutsui 	}
   2103  1.1  tsutsui 	splx(s);
   2104  1.1  tsutsui }
   2105  1.1  tsutsui 
   2106  1.1  tsutsui static void
   2107  1.1  tsutsui trm_reselect(sc)
   2108  1.1  tsutsui 	struct trm_softc *sc;
   2109  1.1  tsutsui {
   2110  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2111  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2112  1.1  tsutsui 	struct trm_dcb *dcb;
   2113  1.1  tsutsui 	struct trm_srb *srb;
   2114  1.1  tsutsui 	int id, lun;
   2115  1.1  tsutsui 
   2116  1.1  tsutsui #ifdef TRM_DEBUG
   2117  1.1  tsutsui 	printf("trm_reselect.................\n");
   2118  1.1  tsutsui #endif
   2119  1.1  tsutsui 	dcb = sc->sc_actdcb;
   2120  1.1  tsutsui 	if (dcb != NULL) {	/* Arbitration lost but Reselection win */
   2121  1.1  tsutsui 		srb = dcb->actsrb;
   2122  1.1  tsutsui 		srb->state = SRB_READY;
   2123  1.1  tsutsui 		trm_rewait_srb(dcb, srb);
   2124  1.1  tsutsui 	}
   2125  1.1  tsutsui 	/* Read Reselected Target Id and LUN */
   2126  1.1  tsutsui 	id = bus_space_read_1(iot, ioh, TRM_SCSI_TARGETID);
   2127  1.1  tsutsui 	lun = bus_space_read_1(iot, ioh, TRM_SCSI_IDMSG) & 0x07;
   2128  1.1  tsutsui 	dcb = sc->sc_linkdcb;
   2129  1.1  tsutsui 	while (id != dcb->id && lun != dcb->lun)
   2130  1.1  tsutsui 		/* get dcb of the reselect id */
   2131  1.1  tsutsui 		dcb = dcb->next;
   2132  1.1  tsutsui 
   2133  1.1  tsutsui 	sc->sc_actdcb = dcb;
   2134  1.1  tsutsui 	if (dcb->mode & EN_TAG_QUEUING) {
   2135  1.2  tsutsui 		srb = &sc->sc_tempsrb;
   2136  1.1  tsutsui 		dcb->actsrb = srb;
   2137  1.1  tsutsui 	} else {
   2138  1.1  tsutsui 		srb = dcb->actsrb;
   2139  1.1  tsutsui 		if (srb == NULL || (srb->state & SRB_DISCONNECT) == 0) {
   2140  1.1  tsutsui 			/*
   2141  1.1  tsutsui 			 * abort command
   2142  1.1  tsutsui 			 */
   2143  1.2  tsutsui 			srb = &sc->sc_tempsrb;
   2144  1.1  tsutsui 			srb->state = SRB_UNEXPECT_RESEL;
   2145  1.1  tsutsui 			dcb->actsrb = srb;
   2146  1.1  tsutsui 			srb->msgout[0] = MSG_ABORT;
   2147  1.1  tsutsui 			trm_msgout_abort(sc, srb);
   2148  1.1  tsutsui 		} else {
   2149  1.1  tsutsui 			if (dcb->flag & ABORT_DEV_) {
   2150  1.1  tsutsui 				srb->state = SRB_ABORT_SENT;
   2151  1.1  tsutsui 				srb->msgout[0] = MSG_ABORT;
   2152  1.1  tsutsui 				trm_msgout_abort(sc, srb);
   2153  1.1  tsutsui 			} else
   2154  1.1  tsutsui 				srb->state = SRB_DATA_XFER;
   2155  1.1  tsutsui 		}
   2156  1.1  tsutsui 	}
   2157  1.1  tsutsui 	srb->phase = PH_BUS_FREE;	/* SCSI bus free Phase */
   2158  1.1  tsutsui 	/*
   2159  1.1  tsutsui 	 * Program HA ID, target ID, period and offset
   2160  1.1  tsutsui 	 */
   2161  1.1  tsutsui 	/* target ID */
   2162  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_TARGETID, id);
   2163  1.1  tsutsui 
   2164  1.1  tsutsui 	/* host ID */
   2165  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id);
   2166  1.1  tsutsui 
   2167  1.1  tsutsui 	/* period */
   2168  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_SYNC, dcb->synctl);
   2169  1.1  tsutsui 
   2170  1.1  tsutsui 	/* offset */
   2171  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, dcb->offset);
   2172  1.1  tsutsui 
   2173  1.1  tsutsui 	/* it's important for atn stop */
   2174  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_DATALATCH);
   2175  1.1  tsutsui 	DELAY(30);
   2176  1.1  tsutsui 	/*
   2177  1.1  tsutsui 	 * SCSI cammand
   2178  1.1  tsutsui 	 */
   2179  1.1  tsutsui 	/* to rls the /ACK signal */
   2180  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_COMMAND, SCMD_MSGACCEPT);
   2181  1.1  tsutsui }
   2182  1.1  tsutsui 
   2183  1.1  tsutsui /*
   2184  1.1  tsutsui  * Complete execution of a SCSI command
   2185  1.1  tsutsui  * Signal completion to the generic SCSI driver
   2186  1.1  tsutsui  */
   2187  1.1  tsutsui static void
   2188  1.1  tsutsui trm_srb_done(sc, dcb, srb)
   2189  1.1  tsutsui 	struct trm_softc *sc;
   2190  1.1  tsutsui 	struct trm_dcb *dcb;
   2191  1.1  tsutsui 	struct trm_srb *srb;
   2192  1.1  tsutsui {
   2193  1.1  tsutsui 	struct scsipi_xfer *xs = srb->xs;
   2194  1.1  tsutsui 	struct scsipi_inquiry_data *ptr;
   2195  1.1  tsutsui 	struct trm_dcb *tempdcb;
   2196  1.1  tsutsui 	int i, j, id, lun, s, tastat;
   2197  1.1  tsutsui 	u_int8_t bval;
   2198  1.1  tsutsui 
   2199  1.1  tsutsui #ifdef	TRM_DEBUG
   2200  1.1  tsutsui 	printf("trm_srb_done..................\n");
   2201  1.1  tsutsui #endif
   2202  1.1  tsutsui 	if ((xs->xs_control & XS_CTL_POLL) == 0)
   2203  1.1  tsutsui 		callout_stop(&xs->xs_callout);
   2204  1.1  tsutsui 
   2205  1.1  tsutsui 	if (xs == NULL)
   2206  1.1  tsutsui 		return;
   2207  1.1  tsutsui 
   2208  1.1  tsutsui 	/*
   2209  1.1  tsutsui 	 * target status
   2210  1.1  tsutsui 	 */
   2211  1.1  tsutsui 	tastat = srb->tastat;
   2212  1.1  tsutsui 
   2213  1.1  tsutsui 	if (srb->flag & AUTO_REQSENSE) {
   2214  1.1  tsutsui 		/*
   2215  1.1  tsutsui 		 * status of auto request sense
   2216  1.1  tsutsui 		 */
   2217  1.1  tsutsui 		srb->flag &= ~AUTO_REQSENSE;
   2218  1.1  tsutsui 		srb->hastat = 0;
   2219  1.1  tsutsui 		srb->tastat = SCSI_CHECK;
   2220  1.1  tsutsui 		if (tastat == SCSI_CHECK) {
   2221  1.1  tsutsui 			xs->error = XS_TIMEOUT;
   2222  1.1  tsutsui 			goto ckc_e;
   2223  1.1  tsutsui 		}
   2224  1.1  tsutsui 		memcpy(srb->cmd, srb->tempcmd, sizeof(srb->tempcmd));
   2225  1.1  tsutsui 
   2226  1.1  tsutsui 		srb->buflen = srb->templen;
   2227  1.1  tsutsui 		srb->sgentry[0].address = srb->tempsg.address;
   2228  1.1  tsutsui 		srb->sgentry[0].length = srb->tempsg.length;
   2229  1.1  tsutsui 		bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, srb->sgoffset,
   2230  1.1  tsutsui 		    TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
   2231  1.1  tsutsui 		xs->status = SCSI_CHECK;
   2232  1.1  tsutsui 		goto ckc_e;
   2233  1.1  tsutsui 	}
   2234  1.1  tsutsui 	/*
   2235  1.1  tsutsui 	 * target status
   2236  1.1  tsutsui 	 */
   2237  1.1  tsutsui 	if (tastat)
   2238  1.1  tsutsui 		switch (tastat) {
   2239  1.1  tsutsui 		case SCSI_CHECK:
   2240  1.1  tsutsui 			trm_request_sense(sc, dcb, srb);
   2241  1.1  tsutsui 			return;
   2242  1.1  tsutsui 		case SCSI_QUEUE_FULL:
   2243  1.1  tsutsui 			dcb->maxcmd = dcb->gosrb_cnt - 1;
   2244  1.1  tsutsui 			trm_rewait_srb(dcb, srb);
   2245  1.1  tsutsui 			srb->hastat = 0;
   2246  1.1  tsutsui 			srb->tastat = 0;
   2247  1.1  tsutsui 			goto ckc_e;
   2248  1.1  tsutsui 		case SCSI_SEL_TIMEOUT:
   2249  1.1  tsutsui 			srb->hastat = H_SEL_TIMEOUT;
   2250  1.1  tsutsui 			srb->tastat = 0;
   2251  1.1  tsutsui 			xs->error = XS_TIMEOUT;
   2252  1.1  tsutsui 			break;
   2253  1.1  tsutsui 		case SCSI_BUSY:
   2254  1.1  tsutsui 			xs->error = XS_BUSY;
   2255  1.1  tsutsui 			break;
   2256  1.1  tsutsui 		case SCSI_RESV_CONFLICT:
   2257  1.1  tsutsui #ifdef TRM_DEBUG
   2258  1.1  tsutsui 			printf("%s: target reserved at ", sc->sc_dev.dv_xname);
   2259  1.1  tsutsui 			printf("%s %d\n", __FILE__, __LINE__);
   2260  1.1  tsutsui #endif
   2261  1.1  tsutsui 			xs->error = XS_BUSY;
   2262  1.1  tsutsui 			break;
   2263  1.1  tsutsui 		default:
   2264  1.1  tsutsui 			srb->hastat = 0;
   2265  1.1  tsutsui 			if (srb->retry) {
   2266  1.1  tsutsui 				srb->retry--;
   2267  1.1  tsutsui 				srb->tastat = 0;
   2268  1.1  tsutsui 				srb->sgindex = 0;
   2269  1.1  tsutsui 				if (trm_start_scsi(sc, dcb, srb))
   2270  1.1  tsutsui 					/*
   2271  1.1  tsutsui 					 * If trm_start_scsi return 1 :
   2272  1.1  tsutsui 					 * current interrupt status is
   2273  1.1  tsutsui 					 * interrupt disreenable.  It's said
   2274  1.1  tsutsui 					 * that SCSI processor has more one
   2275  1.1  tsutsui 					 * SRB need to do.
   2276  1.1  tsutsui 					 */
   2277  1.1  tsutsui 					trm_rewait_srb(dcb, srb);
   2278  1.1  tsutsui 				return;
   2279  1.1  tsutsui 			} else {
   2280  1.1  tsutsui #ifdef TRM_DEBUG
   2281  1.1  tsutsui 				printf("%s: driver stuffup at %s %d\n",
   2282  1.1  tsutsui 				    sc->sc_dev.dv_xname, __FILE__, __LINE__);
   2283  1.1  tsutsui #endif
   2284  1.1  tsutsui 				xs->error = XS_DRIVER_STUFFUP;
   2285  1.1  tsutsui 				break;
   2286  1.1  tsutsui 			}
   2287  1.1  tsutsui 		}
   2288  1.1  tsutsui 	else {
   2289  1.1  tsutsui 		/*
   2290  1.1  tsutsui 		 * process initiator status......
   2291  1.1  tsutsui 		 * Adapter (initiator) status
   2292  1.1  tsutsui 		 */
   2293  1.1  tsutsui 		if (srb->hastat & H_OVER_UNDER_RUN) {
   2294  1.1  tsutsui 			srb->tastat = 0;
   2295  1.1  tsutsui 			/* Illegal length (over/under run) */
   2296  1.1  tsutsui 			xs->error = XS_DRIVER_STUFFUP;
   2297  1.1  tsutsui 		} else if (srb->srbstat & PARITY_ERROR) {
   2298  1.1  tsutsui #ifdef TRM_DEBUG
   2299  1.1  tsutsui 			printf("%s: driver stuffup at %s %d\n",
   2300  1.1  tsutsui 			    sc->sc_dev.dv_xname, __FILE__, __LINE__);
   2301  1.1  tsutsui #endif
   2302  1.1  tsutsui 			/* Driver failed to perform operation */
   2303  1.1  tsutsui 			xs->error = XS_DRIVER_STUFFUP;
   2304  1.1  tsutsui 		} else {	/* No error */
   2305  1.1  tsutsui 			srb->hastat = 0;
   2306  1.1  tsutsui 			srb->tastat = 0;
   2307  1.1  tsutsui 			xs->error = XS_NOERROR;
   2308  1.1  tsutsui 			/* there is no error, (sense is invalid) */
   2309  1.1  tsutsui 		}
   2310  1.1  tsutsui 	}
   2311  1.1  tsutsui ckc_e:
   2312  1.1  tsutsui 	id = srb->xs->xs_periph->periph_target;
   2313  1.1  tsutsui 	lun = srb->xs->xs_periph->periph_lun;
   2314  1.1  tsutsui 	if (sc->devscan[id][lun]) {
   2315  1.1  tsutsui 		/*
   2316  1.1  tsutsui 		 * if SCSI command in "scan devices" duty
   2317  1.1  tsutsui 		 */
   2318  1.1  tsutsui 		if (srb->cmd[0] == TEST_UNIT_READY) {
   2319  1.1  tsutsui 			/* SCSI command phase: test unit ready */
   2320  1.1  tsutsui #ifdef TRM_DEBUG
   2321  1.1  tsutsui 			printf("srb->cmd[0] == TEST_UNIT_READY....\n");
   2322  1.1  tsutsui #endif
   2323  1.1  tsutsui 		} else if (srb->cmd[0] == INQUIRY) {
   2324  1.1  tsutsui 			/*
   2325  1.1  tsutsui 			 * SCSI command phase: inquiry scsi device data
   2326  1.1  tsutsui 			 * (type,capacity,manufacture....
   2327  1.1  tsutsui 			 */
   2328  1.1  tsutsui 			if (xs->error == XS_TIMEOUT)
   2329  1.1  tsutsui 				goto NO_DEV;
   2330  1.1  tsutsui 
   2331  1.1  tsutsui 			ptr = (struct scsipi_inquiry_data *)xs->data;
   2332  1.1  tsutsui 			bval = ptr->device & SID_TYPE;
   2333  1.1  tsutsui 			/*
   2334  1.1  tsutsui 			 * #define T_NODEVICE 0x1f   Unknown or no device type
   2335  1.1  tsutsui 			 */
   2336  1.1  tsutsui 			if (bval == T_NODEVICE) {
   2337  1.1  tsutsui 		NO_DEV:
   2338  1.1  tsutsui #ifdef TRM_DEBUG
   2339  1.1  tsutsui 				printf("trm_srb_done NO Device: ");
   2340  1.1  tsutsui 				printf("id= %d ,lun= %d\n", id, lun);
   2341  1.1  tsutsui #endif
   2342  1.1  tsutsui 				s = splbio();
   2343  1.1  tsutsui 				/*
   2344  1.1  tsutsui 				 * dcb Q link
   2345  1.1  tsutsui 				 * move the head of DCB to temdcb
   2346  1.1  tsutsui 				 */
   2347  1.1  tsutsui 				tempdcb = sc->sc_linkdcb;
   2348  1.1  tsutsui 
   2349  1.1  tsutsui 				/*
   2350  1.1  tsutsui 				 * search current DCB for pass link
   2351  1.1  tsutsui 				 */
   2352  1.1  tsutsui 				while (tempdcb->next != dcb)
   2353  1.1  tsutsui 					tempdcb = tempdcb->next;
   2354  1.1  tsutsui 
   2355  1.1  tsutsui 				/*
   2356  1.1  tsutsui 				 * when the current DCB been found
   2357  1.1  tsutsui 				 * than connect current DCB tail
   2358  1.1  tsutsui 				 * to the DCB tail that before current DCB
   2359  1.1  tsutsui 				 */
   2360  1.1  tsutsui 				tempdcb->next = dcb->next;
   2361  1.1  tsutsui 
   2362  1.1  tsutsui 				/*
   2363  1.1  tsutsui 				 * if there was only one DCB ,connect his
   2364  1.1  tsutsui 				 * tail to his head
   2365  1.1  tsutsui 				 */
   2366  1.1  tsutsui 				if (sc->sc_linkdcb == dcb)
   2367  1.1  tsutsui 					sc->sc_linkdcb = tempdcb->next;
   2368  1.1  tsutsui 
   2369  1.1  tsutsui 				if (sc->sc_roundcb == dcb)
   2370  1.1  tsutsui 					sc->sc_roundcb = tempdcb->next;
   2371  1.1  tsutsui 
   2372  1.1  tsutsui 				/*
   2373  1.1  tsutsui 				 * if no device than free this device DCB
   2374  1.1  tsutsui 				 * free( dcb, M_DEVBUF);
   2375  1.1  tsutsui 				 */
   2376  1.1  tsutsui 				sc->devcnt--;
   2377  1.1  tsutsui #ifdef TRM_DEBUG
   2378  1.1  tsutsui 				printf("sc->devcnt=%d\n", sc->devcnt);
   2379  1.1  tsutsui #endif
   2380  1.1  tsutsui 				if (sc->devcnt == 0) {
   2381  1.1  tsutsui 					sc->sc_linkdcb = NULL;
   2382  1.1  tsutsui 					sc->sc_roundcb = NULL;
   2383  1.1  tsutsui 				}
   2384  1.1  tsutsui 				/* no device set scan device flag=0 */
   2385  1.1  tsutsui 				sc->devscan[id][lun] = 0;
   2386  1.1  tsutsui 				i = 0;
   2387  1.1  tsutsui 				j = 0;
   2388  1.1  tsutsui 				while (i <= sc->maxid) {
   2389  1.1  tsutsui 					while (j < 8) {
   2390  1.1  tsutsui 						if (sc->devscan[i][j] == 1) {
   2391  1.1  tsutsui 							sc->devscan_end = 0;
   2392  1.1  tsutsui 							splx(s);
   2393  1.1  tsutsui 							goto exit;
   2394  1.1  tsutsui 						} else
   2395  1.1  tsutsui 							sc->devscan_end = 1;
   2396  1.1  tsutsui 
   2397  1.1  tsutsui 						j++;
   2398  1.1  tsutsui 					}
   2399  1.1  tsutsui 					j = 0;
   2400  1.1  tsutsui 					i++;
   2401  1.1  tsutsui 				}
   2402  1.1  tsutsui 				splx(s);
   2403  1.1  tsutsui 			} else {
   2404  1.1  tsutsui 				dcb->type = bval;
   2405  1.1  tsutsui 				if (bval == T_DIRECT || bval == T_OPTICAL) {
   2406  1.1  tsutsui 					if ((((ptr->version & 0x07) >= 2) ||
   2407  1.1  tsutsui 					     ((ptr->response_format & 0x0F)
   2408  1.1  tsutsui 					      == 2)) &&
   2409  1.1  tsutsui 					    (ptr->flags3 & SID_CmdQue) &&
   2410  1.1  tsutsui 					    (dcb->tacfg & NTC_DO_TAG_QUEUING) &&
   2411  1.1  tsutsui 					    (dcb->tacfg & NTC_DO_DISCONNECT)) {
   2412  1.1  tsutsui 						dcb->maxcmd = sc->maxtag;
   2413  1.1  tsutsui 						dcb->mode |= EN_TAG_QUEUING;
   2414  1.1  tsutsui 						dcb->tagmask = 0;
   2415  1.1  tsutsui 					} else
   2416  1.1  tsutsui 						dcb->mode |= EN_ATN_STOP;
   2417  1.1  tsutsui 				}
   2418  1.1  tsutsui 			}
   2419  1.1  tsutsui 			/* srb->cmd[0] == INQUIRY */
   2420  1.1  tsutsui 		}
   2421  1.1  tsutsui 		/* sc->devscan[id][lun] */
   2422  1.1  tsutsui 	}
   2423  1.1  tsutsui exit:
   2424  1.1  tsutsui 	if (xs->datalen > 0) {
   2425  1.1  tsutsui 		bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
   2426  1.1  tsutsui 		    srb->dmap->dm_mapsize, (xs->xs_control & XS_CTL_DATA_IN) ?
   2427  1.1  tsutsui 		    BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
   2428  1.1  tsutsui 		bus_dmamap_unload(sc->sc_dmat, srb->dmap);
   2429  1.1  tsutsui 	}
   2430  1.1  tsutsui 	trm_release_srb(sc, dcb, srb);
   2431  1.1  tsutsui 	trm_wait_srb(sc);
   2432  1.1  tsutsui 	xs->xs_status |= XS_STS_DONE;
   2433  1.1  tsutsui 	/* Notify cmd done */
   2434  1.1  tsutsui 	scsipi_done(xs);
   2435  1.1  tsutsui }
   2436  1.1  tsutsui 
   2437  1.1  tsutsui static void
   2438  1.1  tsutsui trm_release_srb(sc, dcb, srb)
   2439  1.1  tsutsui 	struct trm_softc *sc;
   2440  1.1  tsutsui 	struct trm_dcb *dcb;
   2441  1.1  tsutsui 	struct trm_srb *srb;
   2442  1.1  tsutsui {
   2443  1.1  tsutsui 	struct trm_srb *psrb;
   2444  1.1  tsutsui 	int s;
   2445  1.1  tsutsui 
   2446  1.1  tsutsui 	s = splbio();
   2447  1.1  tsutsui 	if (srb == dcb->gosrb)
   2448  1.1  tsutsui 		dcb->gosrb = srb->next;
   2449  1.1  tsutsui 	else {
   2450  1.1  tsutsui 		psrb = dcb->gosrb;
   2451  1.1  tsutsui 		while (psrb->next != srb)
   2452  1.1  tsutsui 			psrb = psrb->next;
   2453  1.1  tsutsui 
   2454  1.1  tsutsui 		psrb->next = srb->next;
   2455  1.1  tsutsui 		if (srb == dcb->last_gosrb)
   2456  1.1  tsutsui 			dcb->last_gosrb = psrb;
   2457  1.1  tsutsui 	}
   2458  1.1  tsutsui 	srb->next = sc->sc_freesrb;
   2459  1.1  tsutsui 	sc->sc_freesrb = srb;
   2460  1.1  tsutsui 	dcb->gosrb_cnt--;
   2461  1.1  tsutsui 	splx(s);
   2462  1.1  tsutsui 	return;
   2463  1.1  tsutsui }
   2464  1.1  tsutsui 
   2465  1.1  tsutsui static void
   2466  1.1  tsutsui trm_doing_srb_done(sc)
   2467  1.1  tsutsui 	struct trm_softc *sc;
   2468  1.1  tsutsui {
   2469  1.1  tsutsui 	struct trm_dcb *dcb, *pdcb;
   2470  1.1  tsutsui 	struct trm_srb *psrb, *psrb2;
   2471  1.1  tsutsui 	struct scsipi_xfer *xs;
   2472  1.1  tsutsui 	int i;
   2473  1.1  tsutsui 
   2474  1.1  tsutsui 	dcb = sc->sc_linkdcb;
   2475  1.1  tsutsui 	if (dcb == NULL)
   2476  1.1  tsutsui 		return;
   2477  1.1  tsutsui 
   2478  1.1  tsutsui 	pdcb = dcb;
   2479  1.1  tsutsui 	do {
   2480  1.1  tsutsui 		psrb = pdcb->gosrb;
   2481  1.1  tsutsui 		for (i = 0; i < pdcb->gosrb_cnt; i++) {
   2482  1.1  tsutsui 			psrb2 = psrb->next;
   2483  1.1  tsutsui 			xs = psrb->xs;
   2484  1.1  tsutsui 			xs->error = XS_TIMEOUT;
   2485  1.1  tsutsui 			/* ReleaseSRB( dcb, srb ); */
   2486  1.1  tsutsui 			psrb->next = sc->sc_freesrb;
   2487  1.1  tsutsui 			sc->sc_freesrb = psrb;
   2488  1.1  tsutsui 			scsipi_done(xs);
   2489  1.1  tsutsui 			psrb = psrb2;
   2490  1.1  tsutsui 		}
   2491  1.1  tsutsui 		pdcb->gosrb_cnt = 0;;
   2492  1.1  tsutsui 		pdcb->gosrb = NULL;
   2493  1.1  tsutsui 		pdcb->tagmask = 0;
   2494  1.1  tsutsui 		pdcb = pdcb->next;
   2495  1.1  tsutsui 	}
   2496  1.1  tsutsui 	while (pdcb != dcb);
   2497  1.1  tsutsui }
   2498  1.1  tsutsui 
   2499  1.1  tsutsui static void
   2500  1.1  tsutsui trm_reset_scsi_bus(sc)
   2501  1.1  tsutsui 	struct trm_softc *sc;
   2502  1.1  tsutsui {
   2503  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2504  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2505  1.1  tsutsui 	int s;
   2506  1.1  tsutsui 
   2507  1.1  tsutsui 	s = splbio();
   2508  1.1  tsutsui 
   2509  1.1  tsutsui 	sc->sc_flag |= RESET_DEV;
   2510  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_RSTSCSI);
   2511  1.1  tsutsui 	while ((bus_space_read_2(iot, ioh, TRM_SCSI_INTSTATUS) &
   2512  1.1  tsutsui 	    INT_SCSIRESET) == 0)
   2513  1.1  tsutsui 		;
   2514  1.1  tsutsui 
   2515  1.1  tsutsui 	splx(s);
   2516  1.1  tsutsui }
   2517  1.1  tsutsui 
   2518  1.1  tsutsui static void
   2519  1.1  tsutsui trm_scsi_reset_detect(sc)
   2520  1.1  tsutsui 	struct trm_softc *sc;
   2521  1.1  tsutsui {
   2522  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2523  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2524  1.1  tsutsui 	int s;
   2525  1.1  tsutsui 
   2526  1.1  tsutsui #ifdef TRM_DEBUG
   2527  1.1  tsutsui 	printf("trm_scsi_reset_detect...............\n");
   2528  1.1  tsutsui #endif
   2529  1.1  tsutsui 	DELAY(1000000);		/* delay 1 sec */
   2530  1.1  tsutsui 
   2531  1.1  tsutsui 	s = splbio();
   2532  1.1  tsutsui 
   2533  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_CONTROL, STOPDMAXFER);
   2534  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_CLRFIFO);
   2535  1.1  tsutsui 
   2536  1.1  tsutsui 	if (sc->sc_flag & RESET_DEV) {
   2537  1.1  tsutsui 		sc->sc_flag |= RESET_DONE;
   2538  1.1  tsutsui 	} else {
   2539  1.1  tsutsui 		sc->sc_flag |= RESET_DETECT;
   2540  1.1  tsutsui 		trm_reset_device(sc);
   2541  1.1  tsutsui 		/* trm_doing_srb_done( sc ); ???? */
   2542  1.1  tsutsui 		trm_recover_srb(sc);
   2543  1.1  tsutsui 		sc->sc_actdcb = NULL;
   2544  1.1  tsutsui 		sc->sc_flag = 0;
   2545  1.1  tsutsui 		trm_wait_srb(sc);
   2546  1.1  tsutsui 	}
   2547  1.1  tsutsui 	splx(s);
   2548  1.1  tsutsui }
   2549  1.1  tsutsui 
   2550  1.1  tsutsui static void
   2551  1.1  tsutsui trm_request_sense(sc, dcb, srb)
   2552  1.1  tsutsui 	struct trm_softc *sc;
   2553  1.1  tsutsui 	struct trm_dcb *dcb;
   2554  1.1  tsutsui 	struct trm_srb *srb;
   2555  1.1  tsutsui {
   2556  1.1  tsutsui 	struct scsipi_xfer *xs = srb->xs;
   2557  1.1  tsutsui 	struct scsipi_sense *ss;
   2558  1.1  tsutsui 	int error, lun = xs->xs_periph->periph_lun;
   2559  1.1  tsutsui 
   2560  1.1  tsutsui 	srb->flag |= AUTO_REQSENSE;
   2561  1.1  tsutsui 	memcpy(srb->tempcmd, srb->cmd, sizeof(srb->tempcmd));
   2562  1.1  tsutsui 
   2563  1.1  tsutsui 	srb->templen = srb->buflen;
   2564  1.1  tsutsui 	srb->tempsg.address = srb->sgentry[0].address;
   2565  1.1  tsutsui 	srb->tempsg.length = srb->sgentry[0].length;
   2566  1.1  tsutsui 
   2567  1.1  tsutsui 	/* Status of initiator/target */
   2568  1.1  tsutsui 	srb->hastat = 0;
   2569  1.1  tsutsui 	srb->tastat = 0;
   2570  1.1  tsutsui 
   2571  1.1  tsutsui 	ss = (struct scsipi_sense *)srb->cmd;
   2572  1.1  tsutsui 	ss->opcode = REQUEST_SENSE;
   2573  1.1  tsutsui 	ss->byte2 = lun << SCSI_CMD_LUN_SHIFT;
   2574  1.1  tsutsui 	ss->unused[0] = ss->unused[1] = 0;
   2575  1.1  tsutsui 	ss->length = sizeof(struct scsipi_sense_data);
   2576  1.1  tsutsui 	ss->control = 0;
   2577  1.1  tsutsui 
   2578  1.1  tsutsui 	srb->buflen = sizeof(struct scsipi_sense_data);
   2579  1.1  tsutsui 	srb->sgcnt = 1;
   2580  1.1  tsutsui 	srb->sgindex = 0;
   2581  1.1  tsutsui 	srb->cmdlen = sizeof(struct scsipi_sense);
   2582  1.1  tsutsui 
   2583  1.1  tsutsui 	if ((error = bus_dmamap_load(sc->sc_dmat, srb->dmap,
   2584  1.1  tsutsui 	    &xs->sense.scsi_sense, srb->buflen, NULL,
   2585  1.1  tsutsui 	    BUS_DMA_READ|BUS_DMA_NOWAIT)) != 0) {
   2586  1.1  tsutsui 		printf("trm_request_sense: can not bus_dmamap_load()\n");
   2587  1.1  tsutsui 		xs->error = XS_DRIVER_STUFFUP;
   2588  1.1  tsutsui 		return;
   2589  1.1  tsutsui 	}
   2590  1.1  tsutsui 	bus_dmamap_sync(sc->sc_dmat, srb->dmap, 0,
   2591  1.1  tsutsui 	    srb->buflen, BUS_DMASYNC_PREREAD);
   2592  1.1  tsutsui 
   2593  1.1  tsutsui 	srb->sgentry[0].address = htole32(srb->dmap->dm_segs[0].ds_addr);
   2594  1.1  tsutsui 	srb->sgentry[0].length = htole32(sizeof(struct scsipi_sense_data));
   2595  1.1  tsutsui 	bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamap, srb->sgoffset,
   2596  1.1  tsutsui 	    TRM_SG_SIZE, BUS_DMASYNC_PREWRITE);
   2597  1.1  tsutsui 
   2598  1.1  tsutsui 	if (trm_start_scsi(sc, dcb, srb))
   2599  1.1  tsutsui 		/*
   2600  1.1  tsutsui 		 * If trm_start_scsi return 1: current interrupt status
   2601  1.1  tsutsui 		 * is interrupt disreenable.  It's said that SCSI processor
   2602  1.1  tsutsui 		 * has more one SRB need to do.
   2603  1.1  tsutsui 		 */
   2604  1.1  tsutsui 		trm_rewait_srb(dcb, srb);
   2605  1.1  tsutsui }
   2606  1.1  tsutsui 
   2607  1.1  tsutsui static void
   2608  1.1  tsutsui trm_msgout_abort(sc, srb)
   2609  1.1  tsutsui 	struct trm_softc *sc;
   2610  1.1  tsutsui 	struct trm_srb *srb;
   2611  1.1  tsutsui {
   2612  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2613  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2614  1.1  tsutsui 
   2615  1.1  tsutsui 	srb->msgcnt = 1;
   2616  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_SETATN);
   2617  1.1  tsutsui 	srb->dcb->flag &= ~ABORT_DEV_;
   2618  1.1  tsutsui }
   2619  1.1  tsutsui 
   2620  1.1  tsutsui /*
   2621  1.1  tsutsui  * initialize the internal structures for a given DCB
   2622  1.1  tsutsui  */
   2623  1.1  tsutsui static void
   2624  1.1  tsutsui trm_init_dcb(sc, dcb, xs)
   2625  1.1  tsutsui 	struct trm_softc *sc;
   2626  1.1  tsutsui 	struct trm_dcb *dcb;
   2627  1.1  tsutsui 	struct scsipi_xfer *xs;
   2628  1.1  tsutsui {
   2629  1.1  tsutsui 	struct trm_nvram *eeprom;
   2630  1.1  tsutsui 	struct trm_dcb *tempdcb;
   2631  1.1  tsutsui 	int index, id, lun, s;
   2632  1.1  tsutsui 
   2633  1.1  tsutsui 	id = xs->xs_periph->periph_target;
   2634  1.1  tsutsui 	lun = xs->xs_periph->periph_lun;
   2635  1.1  tsutsui 
   2636  1.1  tsutsui 	s = splbio();
   2637  1.1  tsutsui 	if (sc->sc_linkdcb == 0) {
   2638  1.1  tsutsui 		sc->sc_linkdcb = dcb;
   2639  1.1  tsutsui 		/*
   2640  1.1  tsutsui 		 * RunRobin impersonate the role that let each device had
   2641  1.1  tsutsui 		 * good proportion about SCSI command proceeding.
   2642  1.1  tsutsui 		 */
   2643  1.1  tsutsui 		sc->sc_roundcb = dcb;
   2644  1.1  tsutsui 		dcb->next = dcb;
   2645  1.1  tsutsui 	} else {
   2646  1.1  tsutsui 		tempdcb = sc->sc_linkdcb;
   2647  1.1  tsutsui 		/* search the last nod of DCB link */
   2648  1.1  tsutsui 		while (tempdcb->next != sc->sc_linkdcb)
   2649  1.1  tsutsui 			tempdcb = tempdcb->next;
   2650  1.1  tsutsui 
   2651  1.1  tsutsui 		/* connect current DCB with last DCB tail */
   2652  1.1  tsutsui 		tempdcb->next = dcb;
   2653  1.1  tsutsui 		/* connect current DCB tail to this DCB Q head */
   2654  1.1  tsutsui 		dcb->next = sc->sc_linkdcb;
   2655  1.1  tsutsui 	}
   2656  1.1  tsutsui 	splx(s);
   2657  1.1  tsutsui 
   2658  1.1  tsutsui 	sc->devcnt++;
   2659  1.1  tsutsui 	dcb->id = id;
   2660  1.1  tsutsui 	dcb->lun = lun;
   2661  1.1  tsutsui 	dcb->waitsrb = NULL;
   2662  1.1  tsutsui 	dcb->gosrb = NULL;
   2663  1.1  tsutsui 	dcb->gosrb_cnt = 0;
   2664  1.1  tsutsui 	dcb->actsrb = NULL;
   2665  1.1  tsutsui 	dcb->tagmask = 0;
   2666  1.1  tsutsui 	dcb->maxcmd = 1;
   2667  1.1  tsutsui 	dcb->flag = 0;
   2668  1.1  tsutsui 
   2669  1.1  tsutsui 	eeprom = &sc->sc_eeprom;
   2670  1.1  tsutsui 	dcb->tacfg = eeprom->target[id].config0;
   2671  1.1  tsutsui 	/*
   2672  1.1  tsutsui 	 * disconnect enable?
   2673  1.1  tsutsui 	 */
   2674  1.1  tsutsui 	dcb->idmsg = MSG_IDENTIFY(lun, dcb->tacfg & NTC_DO_DISCONNECT);
   2675  1.1  tsutsui 	/*
   2676  1.1  tsutsui 	 * tag Qing enable?
   2677  1.1  tsutsui 	 * wide nego, sync nego enable?
   2678  1.1  tsutsui 	 */
   2679  1.1  tsutsui 	dcb->synctl = 0;
   2680  1.1  tsutsui 	dcb->offset = 0;
   2681  1.1  tsutsui 	index = eeprom->target[id].period & 0x07;
   2682  1.1  tsutsui 	dcb->period = trm_clock_period[index];
   2683  1.1  tsutsui 	dcb->mode = 0;
   2684  1.1  tsutsui 	if ((dcb->tacfg & NTC_DO_WIDE_NEGO) && (sc->sc_config & HCC_WIDE_CARD))
   2685  1.1  tsutsui 		/* enable wide nego */
   2686  1.1  tsutsui 		dcb->mode |= WIDE_NEGO_ENABLE;
   2687  1.1  tsutsui 
   2688  1.1  tsutsui 	if ((dcb->tacfg & NTC_DO_SYNC_NEGO) && (lun == 0 || sc->cur_offset > 0))
   2689  1.1  tsutsui 		/* enable sync nego */
   2690  1.1  tsutsui 		dcb->mode |= SYNC_NEGO_ENABLE;
   2691  1.1  tsutsui }
   2692  1.1  tsutsui 
   2693  1.1  tsutsui static void
   2694  1.1  tsutsui trm_link_srb(sc)
   2695  1.1  tsutsui 	struct trm_softc *sc;
   2696  1.1  tsutsui {
   2697  1.1  tsutsui 	struct trm_srb *srb;
   2698  1.1  tsutsui 	int i;
   2699  1.1  tsutsui 
   2700  1.1  tsutsui 	sc->sc_srb = malloc(sizeof(struct trm_srb) * TRM_MAX_SRB,
   2701  1.1  tsutsui 	    M_DEVBUF, M_NOWAIT);
   2702  1.1  tsutsui 	if (sc->sc_srb == NULL) {
   2703  1.1  tsutsui 		printf("%s: can not allocate SRB\n", sc->sc_dev.dv_xname);
   2704  1.1  tsutsui 		return;
   2705  1.1  tsutsui 	}
   2706  1.1  tsutsui 	memset(sc->sc_srb, 0, sizeof(struct trm_srb) * TRM_MAX_SRB);
   2707  1.1  tsutsui 
   2708  1.1  tsutsui 	for (i = 0, srb = sc->sc_srb; i < TRM_MAX_SRB; i++, srb++) {
   2709  1.1  tsutsui 		srb->sgentry = sc->sc_sglist + TRM_MAX_SG_ENTRIES * i;
   2710  1.1  tsutsui 		srb->sgoffset = TRM_SG_SIZE * i;
   2711  1.1  tsutsui 		srb->sgaddr = sc->sc_dmamap->dm_segs[0].ds_addr + srb->sgoffset;
   2712  1.1  tsutsui 		/*
   2713  1.1  tsutsui 		 * map all SRB space to SRB_array
   2714  1.1  tsutsui 		 */
   2715  1.1  tsutsui 		if (bus_dmamap_create(sc->sc_dmat,
   2716  1.1  tsutsui 		    MAXPHYS, TRM_MAX_SG_ENTRIES, MAXPHYS, 0,
   2717  1.1  tsutsui 		    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &srb->dmap)) {
   2718  1.1  tsutsui 			printf("%s: unable to create DMA transfer map...\n",
   2719  1.1  tsutsui 			    sc->sc_dev.dv_xname);
   2720  1.1  tsutsui 			free(sc->sc_srb, M_DEVBUF);
   2721  1.1  tsutsui 			return;
   2722  1.1  tsutsui 		}
   2723  1.1  tsutsui 		if (i != TRM_MAX_SRB - 1) {
   2724  1.1  tsutsui 			/*
   2725  1.1  tsutsui 			 * link all SRB
   2726  1.1  tsutsui 			 */
   2727  1.2  tsutsui 			srb->next = srb + 1;
   2728  1.1  tsutsui #ifdef TRM_DEBUG
   2729  1.2  tsutsui 			printf("srb->next = %8x ", (int) (srb + 1));
   2730  1.1  tsutsui #endif
   2731  1.1  tsutsui 		} else {
   2732  1.1  tsutsui 			/*
   2733  1.1  tsutsui 			 * load NULL to NextSRB of the last SRB
   2734  1.1  tsutsui 			 */
   2735  1.1  tsutsui 			srb->next = NULL;
   2736  1.1  tsutsui 		}
   2737  1.1  tsutsui #ifdef TRM_DEBUG
   2738  1.2  tsutsui 		printf("srb = %8x\n", (int) srb);
   2739  1.1  tsutsui #endif
   2740  1.1  tsutsui 	}
   2741  1.1  tsutsui 	return;
   2742  1.1  tsutsui }
   2743  1.1  tsutsui 
   2744  1.1  tsutsui /*
   2745  1.1  tsutsui  * initialize the internal structures for a given SCSI host
   2746  1.1  tsutsui  */
   2747  1.1  tsutsui static void
   2748  1.1  tsutsui trm_init_sc(sc)
   2749  1.1  tsutsui 	struct trm_softc *sc;
   2750  1.1  tsutsui {
   2751  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2752  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2753  1.1  tsutsui 	struct trm_nvram *eeprom;
   2754  1.1  tsutsui 	int i, j;
   2755  1.1  tsutsui 
   2756  1.1  tsutsui 	eeprom = &sc->sc_eeprom;
   2757  1.1  tsutsui 	sc->maxid = 7;
   2758  1.1  tsutsui 	sc->sc_config = HCC_AUTOTERM | HCC_PARITY;
   2759  1.1  tsutsui 	if (bus_space_read_1(iot, ioh, TRM_GEN_STATUS) & WIDESCSI) {
   2760  1.1  tsutsui 		sc->sc_config |= HCC_WIDE_CARD;
   2761  1.1  tsutsui 		sc->maxid = 15;
   2762  1.1  tsutsui 	}
   2763  1.1  tsutsui 	if (eeprom->channel_cfg & NAC_POWERON_SCSI_RESET)
   2764  1.1  tsutsui 		sc->sc_config |= HCC_SCSI_RESET;
   2765  1.1  tsutsui 
   2766  1.1  tsutsui 	sc->sc_linkdcb = NULL;
   2767  1.1  tsutsui 	sc->sc_roundcb = NULL;
   2768  1.1  tsutsui 	sc->sc_actdcb = NULL;
   2769  1.1  tsutsui 	sc->sc_id = eeprom->scsi_id;
   2770  1.1  tsutsui 	sc->devcnt = 0;
   2771  1.1  tsutsui 	sc->maxtag = 2 << eeprom->max_tag;
   2772  1.1  tsutsui 	sc->sc_flag = 0;
   2773  1.1  tsutsui 	sc->devscan_end = 0;
   2774  1.1  tsutsui 	/*
   2775  1.1  tsutsui 	 * link all device's SRB Q of this adapter
   2776  1.1  tsutsui 	 */
   2777  1.1  tsutsui 	trm_link_srb(sc);
   2778  1.1  tsutsui 	sc->sc_freesrb = sc->sc_srb;
   2779  1.1  tsutsui 	/* allocate DCB array for scan device */
   2780  1.1  tsutsui 	for (i = 0; i <= sc->maxid; i++)
   2781  1.1  tsutsui 		if (sc->sc_id != i)
   2782  1.1  tsutsui 			for (j = 0; j < 8; j++) {
   2783  1.1  tsutsui 				sc->devscan[i][j] = 1;
   2784  1.1  tsutsui 				sc->devflag[i][j] = 0;
   2785  1.1  tsutsui 				sc->sc_dcb[i][j] =
   2786  1.1  tsutsui 				    malloc(sizeof(struct trm_dcb),
   2787  1.1  tsutsui 				    M_DEVBUF, M_WAITOK);
   2788  1.1  tsutsui 			}
   2789  1.1  tsutsui 
   2790  1.1  tsutsui #ifdef TRM_DEBUG
   2791  1.1  tsutsui 	printf("sizeof(struct trm_dcb)= %8x\n", sizeof(struct trm_dcb));
   2792  1.1  tsutsui 	printf("sizeof(struct trm_softc)= %8x\n", sizeof(struct trm_softc));
   2793  1.1  tsutsui 	printf("sizeof(struct trm_srb)= %8x\n", sizeof(struct trm_srb));
   2794  1.1  tsutsui #endif
   2795  1.1  tsutsui 	sc->sc_adapter.adapt_dev = &sc->sc_dev;
   2796  1.1  tsutsui 	sc->sc_adapter.adapt_nchannels = 1;
   2797  1.1  tsutsui 	sc->sc_adapter.adapt_openings = TRM_MAX_SRB;
   2798  1.1  tsutsui 	sc->sc_adapter.adapt_max_periph = TRM_MAX_SRB;
   2799  1.1  tsutsui 	sc->sc_adapter.adapt_request = trm_scsipi_request;
   2800  1.1  tsutsui 	sc->sc_adapter.adapt_minphys = minphys;
   2801  1.1  tsutsui 
   2802  1.1  tsutsui 	sc->sc_channel.chan_adapter = &sc->sc_adapter;
   2803  1.1  tsutsui 	sc->sc_channel.chan_bustype = &scsi_bustype;
   2804  1.1  tsutsui 	sc->sc_channel.chan_channel = 0;
   2805  1.1  tsutsui 	sc->sc_channel.chan_ntargets = sc->maxid + 1;
   2806  1.1  tsutsui 	sc->sc_channel.chan_nluns = 8;
   2807  1.1  tsutsui 	sc->sc_channel.chan_id = sc->sc_id;
   2808  1.1  tsutsui }
   2809  1.1  tsutsui 
   2810  1.1  tsutsui /*
   2811  1.1  tsutsui  * write sc_eeprom 128 bytes to seeprom
   2812  1.1  tsutsui  */
   2813  1.1  tsutsui static void
   2814  1.1  tsutsui trm_eeprom_write_all(sc, eeprom)
   2815  1.1  tsutsui 	struct trm_softc *sc;
   2816  1.1  tsutsui 	struct trm_nvram *eeprom;
   2817  1.1  tsutsui {
   2818  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2819  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2820  1.1  tsutsui 	u_int8_t *buf = (u_int8_t *)eeprom;
   2821  1.1  tsutsui 	u_int8_t addr;
   2822  1.1  tsutsui 
   2823  1.1  tsutsui 	/* Enable SEEPROM */
   2824  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_CONTROL,
   2825  1.1  tsutsui 	    bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) | EN_EEPROM);
   2826  1.1  tsutsui 
   2827  1.1  tsutsui 	/*
   2828  1.1  tsutsui 	 * Write enable
   2829  1.1  tsutsui 	 */
   2830  1.1  tsutsui 	trm_eeprom_write_cmd(sc, 0x04, 0xFF);
   2831  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0);
   2832  1.1  tsutsui 	trm_wait_30us();
   2833  1.1  tsutsui 
   2834  1.1  tsutsui 	for (addr = 0; addr < 128; addr++, buf++)
   2835  1.1  tsutsui 		trm_eeprom_set_data(sc, addr, *buf);
   2836  1.1  tsutsui 
   2837  1.1  tsutsui 	/*
   2838  1.1  tsutsui 	 * Write disable
   2839  1.1  tsutsui 	 */
   2840  1.1  tsutsui 	trm_eeprom_write_cmd(sc, 0x04, 0x00);
   2841  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0);
   2842  1.1  tsutsui 	trm_wait_30us();
   2843  1.1  tsutsui 
   2844  1.1  tsutsui 	/* Disable SEEPROM */
   2845  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_CONTROL,
   2846  1.1  tsutsui 	    bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) & ~EN_EEPROM);
   2847  1.1  tsutsui }
   2848  1.1  tsutsui 
   2849  1.1  tsutsui /*
   2850  1.1  tsutsui  * write one byte to seeprom
   2851  1.1  tsutsui  */
   2852  1.1  tsutsui static void
   2853  1.1  tsutsui trm_eeprom_set_data(sc, addr, data)
   2854  1.1  tsutsui 	struct trm_softc *sc;
   2855  1.1  tsutsui 	u_int8_t addr;
   2856  1.1  tsutsui 	u_int8_t data;
   2857  1.1  tsutsui {
   2858  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2859  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2860  1.1  tsutsui 	int i;
   2861  1.1  tsutsui 	u_int8_t send;
   2862  1.1  tsutsui 
   2863  1.1  tsutsui 	/*
   2864  1.1  tsutsui 	 * Send write command & address
   2865  1.1  tsutsui 	 */
   2866  1.1  tsutsui 	trm_eeprom_write_cmd(sc, 0x05, addr);
   2867  1.1  tsutsui 	/*
   2868  1.1  tsutsui 	 * Write data
   2869  1.1  tsutsui 	 */
   2870  1.1  tsutsui 	for (i = 0; i < 8; i++, data <<= 1) {
   2871  1.1  tsutsui 		send = NVR_SELECT;
   2872  1.1  tsutsui 		if (data & 0x80)	/* Start from bit 7 */
   2873  1.1  tsutsui 			send |= NVR_BITOUT;
   2874  1.1  tsutsui 
   2875  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send);
   2876  1.1  tsutsui 		trm_wait_30us();
   2877  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK);
   2878  1.1  tsutsui 		trm_wait_30us();
   2879  1.1  tsutsui 	}
   2880  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT);
   2881  1.1  tsutsui 	trm_wait_30us();
   2882  1.1  tsutsui 	/*
   2883  1.1  tsutsui 	 * Disable chip select
   2884  1.1  tsutsui 	 */
   2885  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0);
   2886  1.1  tsutsui 	trm_wait_30us();
   2887  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT);
   2888  1.1  tsutsui 	trm_wait_30us();
   2889  1.1  tsutsui 	/*
   2890  1.1  tsutsui 	 * Wait for write ready
   2891  1.1  tsutsui 	 */
   2892  1.1  tsutsui 	for (;;) {
   2893  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM,
   2894  1.1  tsutsui 		    NVR_SELECT | NVR_CLOCK);
   2895  1.1  tsutsui 		trm_wait_30us();
   2896  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT);
   2897  1.1  tsutsui 		trm_wait_30us();
   2898  1.1  tsutsui 		if (bus_space_read_1(iot, ioh, TRM_GEN_NVRAM) & NVR_BITIN)
   2899  1.1  tsutsui 			break;
   2900  1.1  tsutsui 	}
   2901  1.1  tsutsui 	/*
   2902  1.1  tsutsui 	 * Disable chip select
   2903  1.1  tsutsui 	 */
   2904  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0);
   2905  1.1  tsutsui }
   2906  1.1  tsutsui 
   2907  1.1  tsutsui /*
   2908  1.1  tsutsui  * read seeprom 128 bytes to sc_eeprom
   2909  1.1  tsutsui  */
   2910  1.1  tsutsui static void
   2911  1.1  tsutsui trm_eeprom_read_all(sc, eeprom)
   2912  1.1  tsutsui 	struct trm_softc *sc;
   2913  1.1  tsutsui 	struct trm_nvram *eeprom;
   2914  1.1  tsutsui {
   2915  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2916  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2917  1.1  tsutsui 	u_int8_t *buf = (u_int8_t *)eeprom;
   2918  1.1  tsutsui 	u_int8_t addr;
   2919  1.1  tsutsui 
   2920  1.1  tsutsui 	/*
   2921  1.1  tsutsui 	 * Enable SEEPROM
   2922  1.1  tsutsui 	 */
   2923  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_CONTROL,
   2924  1.1  tsutsui 	    bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) | EN_EEPROM);
   2925  1.1  tsutsui 
   2926  1.1  tsutsui 	for (addr = 0; addr < 128; addr++, buf++)
   2927  1.1  tsutsui 		*buf = trm_eeprom_get_data(sc, addr);
   2928  1.1  tsutsui 
   2929  1.1  tsutsui 	/*
   2930  1.1  tsutsui 	 * Disable SEEPROM
   2931  1.1  tsutsui 	 */
   2932  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_CONTROL,
   2933  1.1  tsutsui 	    bus_space_read_1(iot, ioh, TRM_GEN_CONTROL) & ~EN_EEPROM);
   2934  1.1  tsutsui }
   2935  1.1  tsutsui 
   2936  1.1  tsutsui /*
   2937  1.1  tsutsui  * read one byte from seeprom
   2938  1.1  tsutsui  */
   2939  1.1  tsutsui static u_int8_t
   2940  1.1  tsutsui trm_eeprom_get_data(sc, addr)
   2941  1.1  tsutsui 	struct trm_softc *sc;
   2942  1.1  tsutsui 	u_int8_t addr;
   2943  1.1  tsutsui {
   2944  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2945  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2946  1.1  tsutsui 	int i;
   2947  1.1  tsutsui 	u_int8_t read, data = 0;
   2948  1.1  tsutsui 
   2949  1.1  tsutsui 	/*
   2950  1.1  tsutsui 	 * Send read command & address
   2951  1.1  tsutsui 	 */
   2952  1.1  tsutsui 	trm_eeprom_write_cmd(sc, 0x06, addr);
   2953  1.1  tsutsui 
   2954  1.1  tsutsui 	for (i = 0; i < 8; i++) { /* Read data */
   2955  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM,
   2956  1.1  tsutsui 		    NVR_SELECT | NVR_CLOCK);
   2957  1.1  tsutsui 		trm_wait_30us();
   2958  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT);
   2959  1.1  tsutsui 		/*
   2960  1.1  tsutsui 		 * Get data bit while falling edge
   2961  1.1  tsutsui 		 */
   2962  1.1  tsutsui 		read = bus_space_read_1(iot, ioh, TRM_GEN_NVRAM);
   2963  1.1  tsutsui 		data <<= 1;
   2964  1.1  tsutsui 		if (read & NVR_BITIN)
   2965  1.1  tsutsui 			data |= 1;
   2966  1.1  tsutsui 
   2967  1.1  tsutsui 		trm_wait_30us();
   2968  1.1  tsutsui 	}
   2969  1.1  tsutsui 	/*
   2970  1.1  tsutsui 	 * Disable chip select
   2971  1.1  tsutsui 	 */
   2972  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, 0);
   2973  1.1  tsutsui 	return (data);
   2974  1.1  tsutsui }
   2975  1.1  tsutsui 
   2976  1.1  tsutsui /*
   2977  1.1  tsutsui  * write SB and Op Code into seeprom
   2978  1.1  tsutsui  */
   2979  1.1  tsutsui static void
   2980  1.1  tsutsui trm_eeprom_write_cmd(sc, cmd, addr)
   2981  1.1  tsutsui 	struct trm_softc *sc;
   2982  1.1  tsutsui 	u_int8_t cmd;
   2983  1.1  tsutsui 	u_int8_t addr;
   2984  1.1  tsutsui {
   2985  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   2986  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   2987  1.1  tsutsui 	int i;
   2988  1.1  tsutsui 	u_int8_t send;
   2989  1.1  tsutsui 
   2990  1.1  tsutsui 	/* Program SB+OP code */
   2991  1.1  tsutsui 	for (i = 0; i < 3; i++, cmd <<= 1) {
   2992  1.1  tsutsui 		send = NVR_SELECT;
   2993  1.1  tsutsui 		if (cmd & 0x04)	/* Start from bit 2 */
   2994  1.1  tsutsui 			send |= NVR_BITOUT;
   2995  1.1  tsutsui 
   2996  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send);
   2997  1.1  tsutsui 		trm_wait_30us();
   2998  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK);
   2999  1.1  tsutsui 		trm_wait_30us();
   3000  1.1  tsutsui 	}
   3001  1.1  tsutsui 
   3002  1.1  tsutsui 	/* Program address */
   3003  1.1  tsutsui 	for (i = 0; i < 7; i++, addr <<= 1) {
   3004  1.1  tsutsui 		send = NVR_SELECT;
   3005  1.1  tsutsui 		if (addr & 0x40)	/* Start from bit 6 */
   3006  1.1  tsutsui 			send |= NVR_BITOUT;
   3007  1.1  tsutsui 
   3008  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send);
   3009  1.1  tsutsui 		trm_wait_30us();
   3010  1.1  tsutsui 		bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, send | NVR_CLOCK);
   3011  1.1  tsutsui 		trm_wait_30us();
   3012  1.1  tsutsui 	}
   3013  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_GEN_NVRAM, NVR_SELECT);
   3014  1.1  tsutsui 	trm_wait_30us();
   3015  1.1  tsutsui }
   3016  1.1  tsutsui 
   3017  1.1  tsutsui /*
   3018  1.1  tsutsui  * read seeprom 128 bytes to sc_eeprom and check checksum.
   3019  1.1  tsutsui  * If it is wrong, updated with default value.
   3020  1.1  tsutsui  */
   3021  1.1  tsutsui static void
   3022  1.1  tsutsui trm_check_eeprom(sc, eeprom)
   3023  1.1  tsutsui 	struct trm_softc *sc;
   3024  1.1  tsutsui 	struct trm_nvram *eeprom;
   3025  1.1  tsutsui {
   3026  1.1  tsutsui 	struct nvram_target *target;
   3027  1.1  tsutsui 	u_int16_t *ep;
   3028  1.1  tsutsui 	u_int16_t chksum;
   3029  1.1  tsutsui 	int i;
   3030  1.1  tsutsui 
   3031  1.1  tsutsui #ifdef TRM_DEBUG
   3032  1.1  tsutsui 	printf("\n trm_check_eeprom......\n");
   3033  1.1  tsutsui #endif
   3034  1.1  tsutsui 	trm_eeprom_read_all(sc, eeprom);
   3035  1.1  tsutsui 	ep = (u_int16_t *)eeprom;
   3036  1.1  tsutsui 	chksum = 0;
   3037  1.1  tsutsui 	for (i = 0; i < 64; i++)
   3038  1.1  tsutsui 		chksum += le16toh(*ep++);
   3039  1.1  tsutsui 
   3040  1.1  tsutsui 	if (chksum != TRM_NVRAM_CKSUM) {
   3041  1.1  tsutsui #ifdef TRM_DEBUG
   3042  1.1  tsutsui 		printf("TRM_S1040 EEPROM Check Sum ERROR (load default).\n");
   3043  1.1  tsutsui #endif
   3044  1.1  tsutsui 		/*
   3045  1.1  tsutsui 		 * Checksum error, load default
   3046  1.1  tsutsui 		 */
   3047  1.1  tsutsui 		eeprom->subvendor_id[0] = PCI_VENDOR_TEKRAM2 & 0xFF;
   3048  1.1  tsutsui 		eeprom->subvendor_id[1] = PCI_VENDOR_TEKRAM2 >> 8;
   3049  1.1  tsutsui 		eeprom->subsys_id[0] = PCI_PRODUCT_TEKRAM2_DC315 & 0xFF;
   3050  1.1  tsutsui 		eeprom->subsys_id[1] = PCI_PRODUCT_TEKRAM2_DC315 >> 8;
   3051  1.1  tsutsui 		eeprom->subclass = 0x00;
   3052  1.1  tsutsui 		eeprom->vendor_id[0] = PCI_VENDOR_TEKRAM2 & 0xFF;
   3053  1.1  tsutsui 		eeprom->vendor_id[1] = PCI_VENDOR_TEKRAM2 >> 8;
   3054  1.1  tsutsui 		eeprom->device_id[0] = PCI_PRODUCT_TEKRAM2_DC315 & 0xFF;
   3055  1.1  tsutsui 		eeprom->device_id[1] = PCI_PRODUCT_TEKRAM2_DC315 >> 8;
   3056  1.1  tsutsui 		eeprom->reserved0 = 0x00;
   3057  1.1  tsutsui 
   3058  1.1  tsutsui 		for (i = 0, target = eeprom->target;
   3059  1.1  tsutsui 		     i < TRM_MAX_TARGETS;
   3060  1.1  tsutsui 		     i++, target++) {
   3061  1.1  tsutsui 			target->config0 = 0x77;
   3062  1.1  tsutsui 			target->period = 0x00;
   3063  1.1  tsutsui 			target->config2 = 0x00;
   3064  1.1  tsutsui 			target->config3 = 0x00;
   3065  1.1  tsutsui 		}
   3066  1.1  tsutsui 
   3067  1.1  tsutsui 		eeprom->scsi_id = 7;
   3068  1.1  tsutsui 		eeprom->channel_cfg = 0x0F;
   3069  1.1  tsutsui 		eeprom->delay_time = 0;
   3070  1.1  tsutsui 		eeprom->max_tag = 4;
   3071  1.1  tsutsui 		eeprom->reserved1 = 0x15;
   3072  1.1  tsutsui 		eeprom->boot_target = 0;
   3073  1.1  tsutsui 		eeprom->boot_lun = 0;
   3074  1.1  tsutsui 		eeprom->reserved2 = 0;
   3075  1.1  tsutsui 		memset(eeprom->reserved3, 0, sizeof(eeprom->reserved3));
   3076  1.1  tsutsui 
   3077  1.1  tsutsui 		chksum = 0;
   3078  1.1  tsutsui 		ep = (u_int16_t *)eeprom;
   3079  1.1  tsutsui 		for (i = 0; i < 63; i++)
   3080  1.1  tsutsui 			chksum += le16toh(*ep++);
   3081  1.1  tsutsui 
   3082  1.1  tsutsui 		chksum = TRM_NVRAM_CKSUM - chksum;
   3083  1.1  tsutsui 		eeprom->checksum0 = chksum & 0xFF;
   3084  1.1  tsutsui 		eeprom->checksum1 = chksum >> 8;
   3085  1.1  tsutsui 
   3086  1.1  tsutsui 		trm_eeprom_write_all(sc, eeprom);
   3087  1.1  tsutsui 	}
   3088  1.1  tsutsui }
   3089  1.1  tsutsui 
   3090  1.1  tsutsui /*
   3091  1.1  tsutsui  * initialize the SCSI chip ctrl registers
   3092  1.1  tsutsui  */
   3093  1.1  tsutsui static void
   3094  1.1  tsutsui trm_init_adapter(sc)
   3095  1.1  tsutsui 	struct trm_softc *sc;
   3096  1.1  tsutsui {
   3097  1.1  tsutsui 	bus_space_tag_t iot = sc->sc_iot;
   3098  1.1  tsutsui 	bus_space_handle_t ioh = sc->sc_ioh;
   3099  1.1  tsutsui 	u_int8_t bval;
   3100  1.1  tsutsui 
   3101  1.1  tsutsui 	/* program configuration 0 */
   3102  1.1  tsutsui 	bval = PHASELATCH | INITIATOR | BLOCKRST;
   3103  1.1  tsutsui 	if (sc->sc_config & HCC_PARITY)
   3104  1.1  tsutsui 		bval |= PARITYCHECK;
   3105  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_CONFIG0, bval);
   3106  1.1  tsutsui 
   3107  1.1  tsutsui 	/* program configuration 1 */
   3108  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_CONFIG1,
   3109  1.1  tsutsui 	    ACTIVE_NEG | ACTIVE_NEGPLUS);
   3110  1.1  tsutsui 
   3111  1.1  tsutsui 	/* 250ms selection timeout */
   3112  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_TIMEOUT, SEL_TIMEOUT);
   3113  1.1  tsutsui 
   3114  1.1  tsutsui 	/* Mask all the interrupt */
   3115  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_INTEN, 0);
   3116  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_INTEN, 0);
   3117  1.1  tsutsui 
   3118  1.1  tsutsui 	/* Reset SCSI module */
   3119  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_SCSI_CONTROL, DO_RSTMODULE);
   3120  1.1  tsutsui 
   3121  1.1  tsutsui 	/* program Host ID */
   3122  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_HOSTID, sc->sc_id);
   3123  1.1  tsutsui 
   3124  1.1  tsutsui 	/* set ansynchronous transfer */
   3125  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_OFFSET, 0);
   3126  1.1  tsutsui 
   3127  1.1  tsutsui 	/* Trun LED control off */
   3128  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_GEN_CONTROL,
   3129  1.1  tsutsui 	    bus_space_read_2(iot, ioh, TRM_GEN_CONTROL) & ~EN_LED);
   3130  1.1  tsutsui 
   3131  1.1  tsutsui 	/* DMA config */
   3132  1.1  tsutsui 	bus_space_write_2(iot, ioh, TRM_DMA_CONFIG,
   3133  1.1  tsutsui 	    bus_space_read_2(iot, ioh, TRM_DMA_CONFIG) | DMA_ENHANCE);
   3134  1.1  tsutsui 
   3135  1.1  tsutsui 	/* Clear pending interrupt status */
   3136  1.1  tsutsui 	bus_space_read_1(iot, ioh, TRM_SCSI_INTSTATUS);
   3137  1.1  tsutsui 
   3138  1.1  tsutsui 	/* Enable SCSI interrupt */
   3139  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_SCSI_INTEN,
   3140  1.1  tsutsui 	    EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED |
   3141  1.1  tsutsui 	    EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE);
   3142  1.1  tsutsui 	bus_space_write_1(iot, ioh, TRM_DMA_INTEN, EN_SCSIINTR);
   3143  1.1  tsutsui }
   3144  1.1  tsutsui 
   3145  1.1  tsutsui /*
   3146  1.1  tsutsui  * initialize the internal structures for a given SCSI host
   3147  1.1  tsutsui  */
   3148  1.1  tsutsui static int
   3149  1.1  tsutsui trm_init(sc)
   3150  1.1  tsutsui 	struct trm_softc *sc;
   3151  1.1  tsutsui {
   3152  1.1  tsutsui 	bus_dma_segment_t seg;
   3153  1.1  tsutsui 	int error, rseg, all_sgsize;
   3154  1.1  tsutsui 
   3155  1.1  tsutsui 	/*
   3156  1.1  tsutsui 	 * EEPROM CHECKSUM
   3157  1.1  tsutsui 	 */
   3158  1.1  tsutsui 	trm_check_eeprom(sc, &sc->sc_eeprom);
   3159  1.1  tsutsui 	/*
   3160  1.1  tsutsui 	 * MEMORY ALLOCATE FOR ADAPTER CONTROL BLOCK
   3161  1.1  tsutsui 	 * allocate the space for all SCSI control blocks (SRB) for DMA memory
   3162  1.1  tsutsui 	 */
   3163  1.1  tsutsui 	all_sgsize = TRM_MAX_SRB * TRM_SG_SIZE;
   3164  1.1  tsutsui 	if ((error = bus_dmamem_alloc(sc->sc_dmat, all_sgsize, PAGE_SIZE,
   3165  1.1  tsutsui 	    0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) {
   3166  1.1  tsutsui 		printf("%s: unable to allocate SCSI REQUEST BLOCKS, "
   3167  1.1  tsutsui 		    "error = %d\n", sc->sc_dev.dv_xname, error);
   3168  1.1  tsutsui 		return (-1);
   3169  1.1  tsutsui 	}
   3170  1.1  tsutsui 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
   3171  1.1  tsutsui 	    all_sgsize, (caddr_t *) &sc->sc_sglist,
   3172  1.1  tsutsui 	    BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) != 0) {
   3173  1.1  tsutsui 		printf("%s: unable to map SCSI REQUEST BLOCKS, "
   3174  1.1  tsutsui 		    "error = %d\n", sc->sc_dev.dv_xname, error);
   3175  1.1  tsutsui 		return (-1);
   3176  1.1  tsutsui 	}
   3177  1.1  tsutsui 	if ((error = bus_dmamap_create(sc->sc_dmat, all_sgsize, 1,
   3178  1.1  tsutsui 	    all_sgsize, 0, BUS_DMA_NOWAIT, &sc->sc_dmamap)) != 0) {
   3179  1.1  tsutsui 		printf("%s: unable to create SRB DMA maps, "
   3180  1.1  tsutsui 		    "error = %d\n", sc->sc_dev.dv_xname, error);
   3181  1.1  tsutsui 		return (-1);
   3182  1.1  tsutsui 	}
   3183  1.1  tsutsui 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamap,
   3184  1.1  tsutsui 	    sc->sc_sglist, all_sgsize, NULL, BUS_DMA_NOWAIT)) != 0) {
   3185  1.1  tsutsui 		printf("%s: unable to load SRB DMA maps, "
   3186  1.1  tsutsui 		    "error = %d\n", sc->sc_dev.dv_xname, error);
   3187  1.1  tsutsui 		return (-1);
   3188  1.1  tsutsui 	}
   3189  1.1  tsutsui #ifdef	TRM_DEBUG
   3190  1.1  tsutsui 	printf("\n\n%s: all_sgsize=%x\n", sc->sc_dev.dv_xname, all_sgsize);
   3191  1.1  tsutsui #endif
   3192  1.1  tsutsui 	memset(sc->sc_sglist, 0, all_sgsize);
   3193  1.1  tsutsui 	trm_init_sc(sc);
   3194  1.1  tsutsui 	trm_init_adapter(sc);
   3195  1.1  tsutsui 	trm_reset(sc);
   3196  1.1  tsutsui 	return (0);
   3197  1.1  tsutsui }
   3198  1.1  tsutsui 
   3199  1.1  tsutsui /*
   3200  1.1  tsutsui  * attach and init a host adapter
   3201  1.1  tsutsui  */
   3202  1.1  tsutsui static void
   3203  1.1  tsutsui trm_attach(parent, self, aux)
   3204  1.1  tsutsui 	struct device *parent;
   3205  1.1  tsutsui 	struct device *self;
   3206  1.1  tsutsui 	void *aux;
   3207  1.1  tsutsui {
   3208  1.1  tsutsui 	struct pci_attach_args *const pa = aux;
   3209  1.1  tsutsui 	struct trm_softc *sc = (void *) self;
   3210  1.1  tsutsui 	bus_space_tag_t iot;	/* bus space tag */
   3211  1.1  tsutsui 	bus_space_handle_t ioh; /* bus space handle */
   3212  1.1  tsutsui 	pci_intr_handle_t ih;
   3213  1.1  tsutsui 	pcireg_t command;
   3214  1.1  tsutsui 	const char *intrstr;
   3215  1.1  tsutsui 
   3216  1.1  tsutsui 	/*
   3217  1.1  tsutsui 	 * These cards do not allow memory mapped accesses
   3218  1.1  tsutsui 	 * pa_pc:  chipset tag
   3219  1.1  tsutsui 	 * pa_tag: pci tag
   3220  1.1  tsutsui 	 */
   3221  1.1  tsutsui 	command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
   3222  1.1  tsutsui 	if ((command & (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE)) !=
   3223  1.1  tsutsui 	    (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE)) {
   3224  1.1  tsutsui 		command |= PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MASTER_ENABLE;
   3225  1.1  tsutsui 		pci_conf_write(pa->pa_pc, pa->pa_tag,
   3226  1.1  tsutsui 		    PCI_COMMAND_STATUS_REG, command);
   3227  1.1  tsutsui 	}
   3228  1.1  tsutsui 	/*
   3229  1.1  tsutsui 	 * mask for get correct base address of pci IO port
   3230  1.1  tsutsui 	 */
   3231  1.1  tsutsui 	if (pci_mapreg_map(pa, PCI_MAPREG_START, PCI_MAPREG_TYPE_IO, 0,
   3232  1.1  tsutsui 	    &iot, &ioh, NULL, NULL)) {
   3233  1.1  tsutsui 		printf("%s: unable to map registers\n", sc->sc_dev.dv_xname);
   3234  1.1  tsutsui 		return;
   3235  1.1  tsutsui 	}
   3236  1.1  tsutsui 	/*
   3237  1.1  tsutsui 	 * test checksum of eeprom..& initial "ACB" adapter control block...
   3238  1.1  tsutsui 	 */
   3239  1.1  tsutsui 	sc->sc_iot = iot;
   3240  1.1  tsutsui 	sc->sc_ioh = ioh;
   3241  1.1  tsutsui 	sc->sc_dmat = pa->pa_dmat;
   3242  1.1  tsutsui 	if (trm_init(sc)) {
   3243  1.1  tsutsui 		/*
   3244  1.1  tsutsui 		 * Error during initialization!
   3245  1.1  tsutsui 		 */
   3246  1.1  tsutsui 		printf(": Error during initialization\n");
   3247  1.1  tsutsui 		return;
   3248  1.1  tsutsui 	}
   3249  1.1  tsutsui 	/*
   3250  1.1  tsutsui 	 * Now try to attach all the sub-devices
   3251  1.1  tsutsui 	 */
   3252  1.1  tsutsui 	if (sc->sc_config & HCC_WIDE_CARD)
   3253  1.1  tsutsui 		printf(": Tekram DC395UW/F (TRM-S1040) Fast40 "
   3254  1.1  tsutsui 		    "Ultra Wide SCSI Adapter\n");
   3255  1.1  tsutsui 	else
   3256  1.1  tsutsui 		printf(": Tekram DC395U, DC315/U (TRM-S1040) Fast20 "
   3257  1.1  tsutsui 		    "Ultra SCSI Adapter\n");
   3258  1.1  tsutsui 
   3259  1.1  tsutsui 	printf("%s: Adapter ID=%d, Max tag number=%d, %d SCBs\n",
   3260  1.1  tsutsui 	    sc->sc_dev.dv_xname, sc->sc_id, sc->maxtag, TRM_MAX_SRB);
   3261  1.1  tsutsui 	/*
   3262  1.1  tsutsui 	 * Now tell the generic SCSI layer about our bus.
   3263  1.1  tsutsui 	 * map and establish interrupt
   3264  1.1  tsutsui 	 */
   3265  1.1  tsutsui 	if (pci_intr_map(pa, &ih)) {
   3266  1.1  tsutsui 		printf("%s: couldn't map interrupt\n", sc->sc_dev.dv_xname);
   3267  1.1  tsutsui 		return;
   3268  1.1  tsutsui 	}
   3269  1.1  tsutsui 	intrstr = pci_intr_string(pa->pa_pc, ih);
   3270  1.1  tsutsui 
   3271  1.1  tsutsui 	if (pci_intr_establish(pa->pa_pc, ih, IPL_BIO, trm_intr, sc) == NULL) {
   3272  1.1  tsutsui 		printf("%s: couldn't establish interrupt", sc->sc_dev.dv_xname);
   3273  1.1  tsutsui 		if (intrstr != NULL)
   3274  1.1  tsutsui 			printf(" at %s", intrstr);
   3275  1.1  tsutsui 		printf("\n");
   3276  1.1  tsutsui 		return;
   3277  1.1  tsutsui 	}
   3278  1.1  tsutsui 	if (intrstr != NULL)
   3279  1.1  tsutsui 		printf("%s: interrupting at %s\n",
   3280  1.1  tsutsui 		    sc->sc_dev.dv_xname, intrstr);
   3281  1.1  tsutsui 	config_found(&sc->sc_dev, &sc->sc_channel, scsiprint);
   3282  1.1  tsutsui }
   3283  1.1  tsutsui 
   3284  1.1  tsutsui /*
   3285  1.1  tsutsui  * match pci device
   3286  1.1  tsutsui  */
   3287  1.1  tsutsui static int
   3288  1.1  tsutsui trm_probe(parent, match, aux)
   3289  1.1  tsutsui 	struct device *parent;
   3290  1.1  tsutsui 	struct cfdata *match;
   3291  1.1  tsutsui 	void *aux;
   3292  1.1  tsutsui {
   3293  1.1  tsutsui 	struct pci_attach_args *pa = aux;
   3294  1.1  tsutsui 
   3295  1.1  tsutsui 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_TEKRAM2)
   3296  1.1  tsutsui 		switch (PCI_PRODUCT(pa->pa_id)) {
   3297  1.1  tsutsui 		case PCI_PRODUCT_TEKRAM2_DC315:
   3298  1.1  tsutsui 			return (1);
   3299  1.1  tsutsui 		}
   3300  1.1  tsutsui 	return (0);
   3301  1.1  tsutsui }
   3302