Home | History | Annotate | Line # | Download | only in ic
adwlib.c revision 1.9
      1 /* $NetBSD: adwlib.c,v 1.9 2000/02/04 16:23:14 dante Exp $        */
      2 
      3 /*
      4  * Low level routines for the Advanced Systems Inc. SCSI controllers chips
      5  *
      6  * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
      7  * All rights reserved.
      8  *
      9  * Author: Baldassare Dante Profeta <dante (at) mclink.it>
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  * 2. Redistributions in binary form must reproduce the above copyright
     17  *    notice, this list of conditions and the following disclaimer in the
     18  *    documentation and/or other materials provided with the distribution.
     19  * 3. All advertising materials mentioning features or use of this software
     20  *    must display the following acknowledgement:
     21  *        This product includes software developed by the NetBSD
     22  *        Foundation, Inc. and its contributors.
     23  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24  *    contributors may be used to endorse or promote products derived
     25  *    from this software without specific prior written permission.
     26  *
     27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37  * POSSIBILITY OF SUCH DAMAGE.
     38  */
     39 /*
     40  * Ported from:
     41  */
     42 /*
     43  * advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
     44  *
     45  * Copyright (c) 1995-1999 Advanced System Products, Inc.
     46  * All Rights Reserved.
     47  *
     48  * Redistribution and use in source and binary forms, with or without
     49  * modification, are permitted provided that redistributions of source
     50  * code retain the above copyright notice and this comment without
     51  * modification.
     52  */
     53 
     54 #include <sys/types.h>
     55 #include <sys/param.h>
     56 #include <sys/systm.h>
     57 #include <sys/malloc.h>
     58 #include <sys/kernel.h>
     59 #include <sys/queue.h>
     60 #include <sys/device.h>
     61 
     62 #include <machine/bus.h>
     63 #include <machine/intr.h>
     64 
     65 #include <dev/scsipi/scsi_all.h>
     66 #include <dev/scsipi/scsipi_all.h>
     67 #include <dev/scsipi/scsiconf.h>
     68 
     69 #include <dev/pci/pcidevs.h>
     70 
     71 #include <vm/vm.h>
     72 #include <vm/vm_param.h>
     73 #include <vm/pmap.h>
     74 
     75 #include <dev/ic/adwlib.h>
     76 #include <dev/ic/adw.h>
     77 #include <dev/ic/adwmcode.h>
     78 
     79 
     80 /* Static Functions */
     81 
     82 static u_int16_t AdvGet3550EEPConfig __P((bus_space_tag_t, bus_space_handle_t,
     83      							ADW_EEP_3550_CONFIG *));
     84 static u_int16_t AdvGet38C0800EEPConfig __P((bus_space_tag_t, bus_space_handle_t,
     85      							ADW_EEP_38C0800_CONFIG *));
     86 static u_int16_t AdvReadEEPWord __P((bus_space_tag_t, bus_space_handle_t, int));
     87 static void AdvWaitEEPCmd __P((bus_space_tag_t, bus_space_handle_t));
     88 static void AdvSet3550EEPConfig __P((bus_space_tag_t, bus_space_handle_t,
     89 					                 ADW_EEP_3550_CONFIG *));
     90 static void AdvSet38C0800EEPConfig __P((bus_space_tag_t, bus_space_handle_t,
     91 					                 ADW_EEP_38C0800_CONFIG *));
     92 static void AdvInquiryHandling __P((ADW_SOFTC *, ADW_SCSI_REQ_Q *));
     93 
     94 static void AdvSleepMilliSecond __P((u_int32_t));
     95 static void AdvDelayMicroSecond __P((u_int32_t));
     96 
     97 
     98 /*
     99  * EEPROM Configuration.
    100  *
    101  * All drivers should use this structure to set the default EEPROM
    102  * configuration. The BIOS now uses this structure when it is built.
    103  * Additional structure information can be found in advlib.h where
    104  * the structure is defined.
    105  */
    106 static ADW_EEP_3550_CONFIG
    107 Default_3550_EEPROM_Config = {
    108 	ADW_EEPROM_BIOS_ENABLE,	/* cfg_lsw */
    109 	0x0000,			/* cfg_msw */
    110 	0xFFFF,			/* disc_enable */
    111 	0xFFFF,			/* wdtr_able */
    112 	0xFFFF,			/* sdtr_able */
    113 	0xFFFF,			/* start_motor */
    114 	0xFFFF,			/* tagqng_able */
    115 	0xFFFF,			/* bios_scan */
    116 	0,			/* scam_tolerant */
    117 	7,			/* adapter_scsi_id */
    118 	0,			/* bios_boot_delay */
    119 	3,			/* scsi_reset_delay */
    120 	0,			/* bios_id_lun */
    121 	0,			/* termination */
    122 	0,			/* reserved1 */
    123 	0xFFE7,			/* bios_ctrl */
    124 	0xFFFF,			/* ultra_able */
    125 	0,			/* reserved2 */
    126 	ASC_DEF_MAX_HOST_QNG,	/* max_host_qng */
    127 	ASC_DEF_MAX_DVC_QNG,	/* max_dvc_qng */
    128 	0,			/* dvc_cntl */
    129 	0,			/* bug_fix */
    130 	0,			/* serial_number_word1 */
    131 	0,			/* serial_number_word2 */
    132 	0,			/* serial_number_word3 */
    133 	0,			/* check_sum */
    134 	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* oem_name[16] */
    135 	0,			/* dvc_err_code */
    136 	0,			/* adv_err_code */
    137 	0,			/* adv_err_addr */
    138 	0,			/* saved_dvc_err_code */
    139 	0,			/* saved_adv_err_code */
    140 	0,			/* saved_adv_err_addr */
    141 	0			/* num_of_err */
    142 };
    143 
    144 static ADW_EEP_38C0800_CONFIG
    145 Default_38C0800_EEPROM_Config = {
    146 	ADW_EEPROM_BIOS_ENABLE,	/* 00 cfg_lsw */
    147 	0x0000,			/* 01 cfg_msw */
    148 	0xFFFF,			/* 02 disc_enable */
    149 	0xFFFF,			/* 03 wdtr_able */
    150 	0x4444,			/* 04 sdtr_speed1 */
    151 	0xFFFF,			/* 05 start_motor */
    152 	0xFFFF,			/* 06 tagqng_able */
    153 	0xFFFF,			/* 07 bios_scan */
    154 	0,			/* 08 scam_tolerant */
    155 	7,			/* 09 adapter_scsi_id */
    156 	0,			/*    bios_boot_delay */
    157 	3,			/* 10 scsi_reset_delay */
    158 	0,			/*    bios_id_lun */
    159 	0,			/* 11 termination_se */
    160 	0,			/*    termination_lvd */
    161 	0xFFE7,			/* 12 bios_ctrl */
    162 	0x4444,			/* 13 sdtr_speed2 */
    163 	0x4444,			/* 14 sdtr_speed3 */
    164 	ASC_DEF_MAX_HOST_QNG,	/* 15 max_host_qng */
    165 	ASC_DEF_MAX_DVC_QNG,	/*    max_dvc_qng */
    166 	0,			/* 16 dvc_cntl */
    167 	0x4444,			/* 17 sdtr_speed4 */
    168 	0,			/* 18 serial_number_word1 */
    169 	0,			/* 19 serial_number_word2 */
    170 	0,			/* 20 serial_number_word3 */
    171 	0,			/* 21 check_sum */
    172 	{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* 22-29 oem_name[16] */
    173 	0,			/* 30 dvc_err_code */
    174 	0,			/* 31 adv_err_code */
    175 	0,			/* 32 adv_err_addr */
    176 	0,			/* 33 saved_dvc_err_code */
    177 	0,			/* 34 saved_adv_err_code */
    178 	0,			/* 35 saved_adv_err_addr */
    179 	0,			/* 36 reserved */
    180 	0,			/* 37 reserved */
    181 	0,			/* 38 reserved */
    182 	0,			/* 39 reserved */
    183 	0,			/* 40 reserved */
    184 	0,			/* 41 reserved */
    185 	0,			/* 42 reserved */
    186 	0,			/* 43 reserved */
    187 	0,			/* 44 reserved */
    188 	0,			/* 45 reserved */
    189 	0,			/* 46 reserved */
    190 	0,			/* 47 reserved */
    191 	0,			/* 48 reserved */
    192 	0,			/* 49 reserved */
    193 	0,			/* 50 reserved */
    194 	0,			/* 51 reserved */
    195 	0,			/* 52 reserved */
    196 	0,			/* 53 reserved */
    197 	0,			/* 54 reserved */
    198 	0,			/* 55 reserved */
    199 	0,			/* 56 cisptr_lsw */
    200 	0,			/* 57 cisprt_msw */
    201 	PCI_VENDOR_ADVSYS,	/* 58 subsysvid */
    202 	PCI_PRODUCT_ADVSYS_U2W,	/* 59 subsysid */
    203 	0,			/* 60 reserved */
    204 	0,			/* 61 reserved */
    205 	0,			/* 62 reserved */
    206 	0			/* 63 reserved */
    207 };
    208 
    209 /*
    210  * Initialize the ASC3550.
    211  *
    212  * On failure set the ADW_SOFTC field 'err_code' and return ADW_ERROR.
    213  *
    214  * For a non-fatal error return a warning code. If there are no warnings
    215  * then 0 is returned.
    216  */
    217 int
    218 AdvInitAsc3550Driver(sc)
    219 ADW_SOFTC      *sc;
    220 {
    221 	bus_space_tag_t iot = sc->sc_iot;
    222 	bus_space_handle_t ioh = sc->sc_ioh;
    223 	u_int16_t	warn_code;
    224 	u_int32_t	sum;
    225 	int		begin_addr;
    226 	int		end_addr;
    227 	u_int16_t	code_sum;
    228 	int		word;
    229 	int		i, j;
    230 	int		adv_asc3550_expanded_size;
    231 	u_int16_t	scsi_cfg1;
    232 	u_int8_t	tid;
    233 	u_int16_t	bios_mem[ASC_MC_BIOSLEN/2];	/* BIOS RISC Memory
    234 								0x40-0x8F. */
    235 	u_int16_t	wdtr_able = 0, sdtr_able, tagqng_able;
    236 	u_int8_t	max_cmd[ADW_MAX_TID + 1];
    237 
    238 
    239 	warn_code = 0;
    240 
    241 	/*
    242 	 * Save the RISC memory BIOS region before writing the microcode.
    243 	 * The BIOS may already be loaded and using its RISC LRAM region
    244 	 * so its region must be saved and restored.
    245 	 *
    246 	 * Note: This code makes the assumption, which is currently true,
    247 	 * that a chip reset does not clear RISC LRAM.
    248 	 */
    249 	for (i = 0; i < ASC_MC_BIOSLEN/2; i++) {
    250 		ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_BIOSMEM + (2*i), bios_mem[i]);
    251 	}
    252 
    253 	/*
    254 	 * Save current per TID negotiated values.
    255 	 */
    256 	if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA) {
    257 
    258 		u_int16_t  bios_version, major, minor;
    259 
    260 		bios_version = bios_mem[(ASC_MC_BIOS_VERSION-ASC_MC_BIOSMEM)/2];
    261 		major = (bios_version  >> 12) & 0xF;
    262 		minor = (bios_version  >> 8) & 0xF;
    263 		if (major < 3 || (major == 3 && minor == 1)) {
    264 		    /* BIOS 3.1 and earlier location of 'wdtr_able' variable. */
    265 		    ADW_READ_WORD_LRAM(iot, ioh, 0x120, wdtr_able);
    266 		} else {
    267 		    ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, wdtr_able);
    268 		}
    269 	}
    270 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sdtr_able);
    271 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE, tagqng_able);
    272 	for (tid = 0; tid <= ADW_MAX_TID; tid++) {
    273 		ADW_READ_BYTE_LRAM(iot, ioh, ASC_MC_NUMBER_OF_MAX_CMD + tid,
    274 			max_cmd[tid]);
    275 	}
    276 
    277 	/*
    278 	 * Load the Microcode
    279 	 *
    280 	 * Write the microcode image to RISC memory starting at address 0.
    281 	 */
    282 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
    283 
    284 	/* Assume the following compressed format of the microcode buffer:
    285 	 *
    286 	 *  254 word (508 byte) table indexed by byte code followed
    287 	 *  by the following byte codes:
    288 	 *
    289 	 *    1-Byte Code:
    290 	 *	00: Emit word 0 in table.
    291 	 *	01: Emit word 1 in table.
    292 	 *	.
    293 	 *	FD: Emit word 253 in table.
    294 	 *
    295 	 *    Multi-Byte Code:
    296 	 *	FE WW WW: (3 byte code) Word to emit is the next word WW WW.
    297 	 *	FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
    298 	 */
    299 	word = 0;
    300 	for (i = 253 * 2; i < adv_asc3550_mcode_size; i++) {
    301 		if (adv_asc3550_mcode[i] == 0xff) {
    302 			for (j = 0; j < adv_asc3550_mcode[i + 1]; j++) {
    303 				ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh,
    304 				  (((u_int16_t)adv_asc3550_mcode[i + 3] << 8) |
    305 				  adv_asc3550_mcode[i + 2]));
    306 				word++;
    307 			}
    308 			i += 3;
    309 		} else if (adv_asc3550_mcode[i] == 0xfe) {
    310 			ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh,
    311 			    (((u_int16_t)adv_asc3550_mcode[i + 2] << 8) |
    312 			    adv_asc3550_mcode[i + 1]));
    313 			i += 2;
    314 			word++;
    315 		} else {
    316 			ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, (((u_int16_t)
    317 			 adv_asc3550_mcode[(adv_asc3550_mcode[i] * 2) + 1] <<8) |
    318 			 adv_asc3550_mcode[adv_asc3550_mcode[i] * 2]));
    319 			word++;
    320 		}
    321 	}
    322 
    323 	/*
    324 	 * Set 'word' for later use to clear the rest of memory and save
    325 	 * the expanded mcode size.
    326 	 */
    327 	word *= 2;
    328 	adv_asc3550_expanded_size = word;
    329 
    330 	/*
    331 	 * Clear the rest of ASC-3550 Internal RAM (8KB).
    332 	 */
    333 	for (; word < ADV_3550_MEMSIZE; word += 2) {
    334 		ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, 0);
    335 	}
    336 
    337 	/*
    338 	 * Verify the microcode checksum.
    339 	 */
    340 	sum = 0;
    341 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
    342 
    343 	for (word = 0; word < adv_asc3550_expanded_size; word += 2) {
    344 		sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
    345 	}
    346 
    347 	if (sum != adv_asc3550_mcode_chksum) {
    348 		return ASC_IERR_MCODE_CHKSUM;
    349 	}
    350 
    351 	/*
    352 	 * Restore the RISC memory BIOS region.
    353 	 */
    354 	for (i = 0; i < ASC_MC_BIOSLEN/2; i++) {
    355 		ADW_WRITE_BYTE_LRAM(iot, ioh, ASC_MC_BIOSMEM + (2 * i),
    356 				bios_mem[i]);
    357 	}
    358 
    359 	/*
    360 	 * Calculate and write the microcode code checksum to the microcode
    361 	 * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
    362 	 */
    363 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
    364 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_END_ADDR, end_addr);
    365 	code_sum = 0;
    366 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, begin_addr);
    367 	for (word = begin_addr; word < end_addr; word += 2) {
    368 		code_sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
    369 	}
    370 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CODE_CHK_SUM, code_sum);
    371 
    372 	/*
    373 	 * Read and save microcode version and date.
    374 	 */
    375 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_VERSION_DATE,
    376 			sc->cfg.mcode_date);
    377 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_VERSION_NUM,
    378 			sc->cfg.mcode_version);
    379 
    380 	/*
    381 	 * Set the chip type to indicate the ASC3550.
    382 	 */
    383 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC3550);
    384 
    385 	/*
    386 	 * If the PCI Configuration Command Register "Parity Error Response
    387 	 * Control" Bit was clear (0), then set the microcode variable
    388 	 * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
    389 	 * to ignore DMA parity errors.
    390 	 */
    391 	if (sc->cfg.control_flag & CONTROL_FLAG_IGNORE_PERR) {
    392 		/*
    393 		 * Note: Don't remove the use of a temporary variable in
    394 		 * the following code, otherwise some  C compiler
    395 		 * might turn the following lines into a no-op.
    396 		 */
    397 		ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CONTROL_FLAG, word);
    398 		word |= CONTROL_FLAG_IGNORE_PERR;
    399 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CONTROL_FLAG, word);
    400 	}
    401 
    402 	/*
    403 	 * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO
    404 	 * threshold of 128 bytes. This register is only accessible to the host.
    405 	 */
    406 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_DMA_CFG0,
    407 			START_CTL_EMFU | READ_CMD_MRM);
    408 
    409 	/*
    410 	 * Microcode operating variables for WDTR, SDTR, and command tag
    411 	 * queuing will be set in AdvInquiryHandling() based on what a
    412 	 * device reports it is capable of in Inquiry byte 7.
    413 	 *
    414 	 * If SCSI Bus Resets haev been disabled, then directly set
    415 	 * SDTR and WDTR from the EEPROM configuration. This will allow
    416 	 * the BIOS and warm boot to work without a SCSI bus hang on
    417 	 * the Inquiry caused by host and target mismatched DTR values.
    418 	 * Without the SCSI Bus Reset, before an Inquiry a device can't
    419 	 * be assumed to be in Asynchronous, Narrow mode.
    420 	 */
    421 	if ((sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
    422 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE,
    423 				sc->wdtr_able);
    424 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE,
    425 				sc->sdtr_able);
    426 	}
    427 
    428 	/*
    429 	 * Set microcode operating variables for SDTR_SPEED1, SDTR_SPEED2,
    430 	 * SDTR_SPEED3, and SDTR_SPEED4 based on the ULTRA EEPROM per TID
    431 	 * bitmask. These values determine the maximum SDTR speed negotiated
    432 	 * with a device.
    433 	 *
    434 	 * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
    435 	 * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
    436 	 * without determining here whether the device supports SDTR.
    437 	 *
    438 	 * 4-bit speed  SDTR speed name
    439 	 * ===========  ===============
    440 	 * 0000b (0x0)  SDTR disabled
    441 	 * 0001b (0x1)  5 Mhz
    442 	 * 0010b (0x2)  10 Mhz
    443 	 * 0011b (0x3)  20 Mhz (Ultra)
    444 	 * 0100b (0x4)  40 Mhz (LVD/Ultra2)
    445 	 * 0101b (0x5)  80 Mhz (LVD2/Ultra3)
    446 	 * 0110b (0x6)  Undefined
    447 	 * .
    448 	 * 1111b (0xF)  Undefined
    449 	 */
    450 	word = 0;
    451 	for (tid = 0; tid <= ADW_MAX_TID; tid++) {
    452 		if (ADW_TID_TO_TIDMASK(tid) & sc->ultra_able) {
    453 			/* Set Ultra speed for TID 'tid'. */
    454 			word |= (0x3 << (4 * (tid % 4)));
    455 		} else {
    456 			/* Set Fast speed for TID 'tid'. */
    457 			word |= (0x2 << (4 * (tid % 4)));
    458 		}
    459 		/* Check if done with sdtr_speed1. */
    460 		if (tid == 3) {
    461 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED1, word);
    462 			word = 0;
    463 		/* Check if done with sdtr_speed2. */
    464 		} else if (tid == 7) {
    465 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED2, word);
    466 			word = 0;
    467 		/* Check if done with sdtr_speed3. */
    468 		} else if (tid == 11) {
    469 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED3, word);
    470 			word = 0;
    471 		/* Check if done with sdtr_speed4. */
    472 		} else if (tid == 15) {
    473 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED4, word);
    474 			/* End of loop. */
    475 		}
    476 	}
    477 
    478 	/*
    479 	 * Set microcode operating variable for the disconnect per TID bitmask.
    480 	 */
    481 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DISC_ENABLE, sc->cfg.disc_enable);
    482 
    483 
    484 	/*
    485 	 * Set SCSI_CFG0 Microcode Default Value.
    486 	 *
    487 	 * The microcode will set the SCSI_CFG0 register using this value
    488 	 * after it is started below.
    489 	 */
    490 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SCSI_CFG0,
    491 		ADW_PARITY_EN | ADW_SEL_TMO_LONG | ADW_OUR_ID_EN |
    492 			sc->chip_scsi_id);
    493 
    494 	/*
    495 	 * Determine SCSI_CFG1 Microcode Default Value.
    496 	 *
    497 	 * The microcode will set the SCSI_CFG1 register using this value
    498 	 * after it is started below.
    499 	 */
    500 
    501 	/* Read current SCSI_CFG1 Register value. */
    502 	scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
    503 
    504 	/*
    505 	 * If all three connectors are in use, return an error.
    506 	 */
    507 	if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
    508 		(scsi_cfg1 & CABLE_ILLEGAL_B) == 0) {
    509 		return ASC_IERR_ILLEGAL_CONNECTION;
    510 	}
    511 
    512 	/*
    513 	 * If the internal narrow cable is reversed all of the SCSI_CTRL
    514 	 * register signals will be set. Check for and return an error if
    515 	 * this condition is found.
    516 	 */
    517 	if ((ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CTRL) & 0x3F07) ==
    518 			0x3F07) {
    519 		return ASC_IERR_REVERSED_CABLE;
    520 	}
    521 
    522 	/*
    523 	 * If this is a differential board and a single-ended device
    524 	 * is attached to one of the connectors, return an error.
    525 	 */
    526 	if ((scsi_cfg1 & ADW_DIFF_MODE) && (scsi_cfg1 & ADW_DIFF_SENSE) == 0) {
    527 		return ASC_IERR_SINGLE_END_DEVICE;
    528 	}
    529 
    530 	/*
    531 	 * If automatic termination control is enabled, then set the
    532 	 * termination value based on a table listed in a_condor.h.
    533 	 *
    534 	 * If manual termination was specified with an EEPROM setting
    535 	 * then 'termination' was set-up in AdvInitFrom3550EEPROM() and
    536 	 * is ready to be 'ored' into SCSI_CFG1.
    537 	 */
    538 	if (sc->cfg.termination == 0) {
    539 		/*
    540 		 * The software always controls termination by setting TERM_CTL_SEL.
    541 		 * If TERM_CTL_SEL were set to 0, the hardware would set termination.
    542 		 */
    543 		sc->cfg.termination |= ADW_TERM_CTL_SEL;
    544 
    545 		switch(scsi_cfg1 & ADW_CABLE_DETECT) {
    546 			/* TERM_CTL_H: on, TERM_CTL_L: on */
    547 			case 0x3: case 0x7: case 0xB: case 0xD: case 0xE: case 0xF:
    548 				sc->cfg.termination |= (ADW_TERM_CTL_H | ADW_TERM_CTL_L);
    549 				break;
    550 
    551 			/* TERM_CTL_H: on, TERM_CTL_L: off */
    552 			case 0x1: case 0x5: case 0x9: case 0xA: case 0xC:
    553 				sc->cfg.termination |= ADW_TERM_CTL_H;
    554 				break;
    555 
    556 			/* TERM_CTL_H: off, TERM_CTL_L: off */
    557 			case 0x2: case 0x6:
    558 				break;
    559 		}
    560 	}
    561 
    562 	/*
    563 	 * Clear any set TERM_CTL_H and TERM_CTL_L bits.
    564 	 */
    565 	scsi_cfg1 &= ~ADW_TERM_CTL;
    566 
    567 	/*
    568 	 * Invert the TERM_CTL_H and TERM_CTL_L bits and then
    569 	 * set 'scsi_cfg1'. The TERM_POL bit does not need to be
    570 	 * referenced, because the hardware internally inverts
    571 	 * the Termination High and Low bits if TERM_POL is set.
    572 	 */
    573 	scsi_cfg1 |= (ADW_TERM_CTL_SEL | (~sc->cfg.termination & ADW_TERM_CTL));
    574 
    575 	/*
    576 	 * Set SCSI_CFG1 Microcode Default Value
    577 	 *
    578 	 * Set filter value and possibly modified termination control
    579 	 * bits in the Microcode SCSI_CFG1 Register Value.
    580 	 *
    581 	 * The microcode will set the SCSI_CFG1 register using this value
    582 	 * after it is started below.
    583 	 */
    584 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SCSI_CFG1,
    585 		ADW_FLTR_DISABLE | scsi_cfg1);
    586 
    587 	/*
    588 	 * Set MEM_CFG Microcode Default Value
    589 	 *
    590 	 * The microcode will set the MEM_CFG register using this value
    591 	 * after it is started below.
    592 	 *
    593 	 * MEM_CFG may be accessed as a word or byte, but only bits 0-7
    594 	 * are defined.
    595 	 *
    596 	 * ASC-3550 has 8KB internal memory.
    597 	 */
    598 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_MEM_CFG,
    599 		ADW_BIOS_EN | ADW_RAM_SZ_8KB);
    600 
    601 	/*
    602 	 * Set SEL_MASK Microcode Default Value
    603 	 *
    604 	 * The microcode will set the SEL_MASK register using this value
    605 	 * after it is started below.
    606 	 */
    607 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SEL_MASK,
    608 		ADW_TID_TO_TIDMASK(sc->chip_scsi_id));
    609 
    610 
    611 	/*
    612 	 * Set-up the Host->RISC Initiator Command Queue (ICQ).
    613 	 */
    614 
    615 	if ((sc->icq_sp = sc->carr_freelist) == NULL) {
    616 		return ASC_IERR_NO_CARRIER;
    617 	}
    618 	sc->carr_freelist = adw_carrier_phys_kv(sc,
    619 			ASC_GET_CARRP(sc->icq_sp->next_vpa));
    620 
    621 	/*
    622 	 * The first command issued will be placed in the stopper carrier.
    623 	 */
    624 	sc->icq_sp->next_vpa = ASC_CQ_STOPPER;
    625 
    626 	/*
    627 	 * Set RISC ICQ physical address start value.
    628 	 */
    629 	ADW_WRITE_DWORD_LRAM(iot, ioh, ASC_MC_ICQ, sc->icq_sp->carr_pa);
    630 
    631 	/*
    632 	 * Set-up the RISC->Host Initiator Response Queue (IRQ).
    633 	 */
    634 	if ((sc->irq_sp = sc->carr_freelist) == NULL) {
    635 		return ASC_IERR_NO_CARRIER;
    636 	}
    637 	sc->carr_freelist = adw_carrier_phys_kv(sc,
    638 			ASC_GET_CARRP(sc->irq_sp->next_vpa));
    639 
    640 	/*
    641 	 * The first command completed by the RISC will be placed in
    642 	 * the stopper.
    643 	 *
    644 	 * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
    645 	 * completed the RISC will set the ASC_RQ_STOPPER bit.
    646 	 */
    647 	sc->irq_sp->next_vpa = ASC_CQ_STOPPER;
    648 
    649 	/*
    650 	 * Set RISC IRQ physical address start value.
    651 	 */
    652 	ADW_WRITE_DWORD_LRAM(iot, ioh, ASC_MC_IRQ, sc->irq_sp->carr_pa);
    653 	sc->carr_pending_cnt = 0;
    654 
    655 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_INTR_ENABLES,
    656 		(ADW_INTR_ENABLE_HOST_INTR | ADW_INTR_ENABLE_GLOBAL_INTR));
    657 
    658 	/*
    659 	 * Note: Don't remove the use of a temporary variable in
    660 	 * the following code, otherwise some C compiler
    661 	 * might turn the following lines into a no-op.
    662 	 */
    663 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_BEGIN_ADDR, word);
    664 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_PC, word);
    665 
    666 	/* finally, finally, gentlemen, start your engine */
    667 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RISC_CSR, ADW_RISC_CSR_RUN);
    668 
    669 	/*
    670 	 * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
    671 	 * Resets should be performed. The RISC has to be running
    672 	 * to issue a SCSI Bus Reset.
    673 	 */
    674 	if (sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
    675 	{
    676 		/*
    677 		 * If the BIOS Signature is present in memory, restore the
    678 		 * BIOS Handshake Configuration Table and do not perform
    679 		 * a SCSI Bus Reset.
    680 		 */
    681 		if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] ==
    682 				0x55AA) {
    683 			/*
    684 			 * Restore per TID negotiated values.
    685 			 */
    686 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE,
    687 					wdtr_able);
    688 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE,
    689 					sdtr_able);
    690 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE,
    691 					tagqng_able);
    692 			for (tid = 0; tid <= ADW_MAX_TID; tid++) {
    693 				ADW_WRITE_BYTE_LRAM(iot, ioh,
    694 					ASC_MC_NUMBER_OF_MAX_CMD + tid,
    695 					max_cmd[tid]);
    696 			}
    697 		} else {
    698 			if (AdvResetCCB(sc) != ADW_TRUE) {
    699 				warn_code = ASC_WARN_BUSRESET_ERROR;
    700 			}
    701 		}
    702 	}
    703 
    704     return warn_code;
    705 }
    706 
    707 /*
    708  * Initialize the ASC-38C0800.
    709  *
    710  * On failure set the ADV_DVC_VAR field 'err_code' and return ADW_ERROR.
    711  *
    712  * For a non-fatal error return a warning code. If there are no warnings
    713  * then 0 is returned.
    714  */
    715 int
    716 AdvInitAsc38C0800Driver(sc)
    717 ADW_SOFTC      *sc;
    718 {
    719 	bus_space_tag_t iot = sc->sc_iot;
    720 	bus_space_handle_t ioh = sc->sc_ioh;
    721 	u_int16_t	warn_code;
    722 	u_int32_t	sum;
    723 	int	  	begin_addr;
    724 	int	   	end_addr;
    725 	u_int16_t	code_sum;
    726 	int	   	word;
    727 	int	   	i, j;
    728 	int	   	adv_asc38C0800_expanded_size;
    729 	u_int16_t	scsi_cfg1;
    730 	u_int8_t	byte;
    731 	u_int8_t	tid;
    732 	u_int16_t	bios_mem[ASC_MC_BIOSLEN/2];	/* BIOS RISC Memory
    733 								0x40-0x8F. */
    734 	u_int16_t	wdtr_able, sdtr_able, tagqng_able;
    735 	u_int8_t	max_cmd[ADW_MAX_TID + 1];
    736 
    737 
    738 	warn_code = 0;
    739 
    740 	/*
    741 	 * Save the RISC memory BIOS region before writing the microcode.
    742 	 * The BIOS may already be loaded and using its RISC LRAM region
    743 	 * so its region must be saved and restored.
    744 	 *
    745 	 * Note: This code makes the assumption, which is currently true,
    746 	 * that a chip reset does not clear RISC LRAM.
    747 	 */
    748 	for (i = 0; i < ASC_MC_BIOSLEN/2; i++) {
    749 	    ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
    750 	}
    751 
    752 	/*
    753 	 * Save current per TID negotiated values.
    754 	 */
    755 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, wdtr_able);
    756 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sdtr_able);
    757 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE, tagqng_able);
    758 	for (tid = 0; tid <= ADW_MAX_TID; tid++) {
    759 		ADW_READ_BYTE_LRAM(iot, ioh, ASC_MC_NUMBER_OF_MAX_CMD + tid,
    760 			max_cmd[tid]);
    761 	}
    762 
    763 	/*
    764 	 * RAM BIST (RAM Built-In Self Test)
    765 	 *
    766 	 * Address : I/O base + offset 0x38h register (byte).
    767 	 * Function: Bit 7-6(RW) : RAM mode
    768 	 *			    Normal Mode   : 0x00
    769 	 *			    Pre-test Mode : 0x40
    770 	 *			    RAM Test Mode : 0x80
    771 	 *	     Bit 5	 : unused
    772 	 *	     Bit 4(RO)   : Done bit
    773 	 *	     Bit 3-0(RO) : Status
    774 	 *			    Host Error    : 0x08
    775 	 *			    Int_RAM Error : 0x04
    776 	 *			    RISC Error    : 0x02
    777 	 *			    SCSI Error    : 0x01
    778 	 *			    No Error	  : 0x00
    779 	 *
    780 	 * Note: RAM BIST code should be put right here, before loading the
    781 	 * microcode and after saving the RISC memory BIOS region.
    782 	 */
    783 
    784 	/*
    785 	 * LRAM Pre-test
    786 	 *
    787 	 * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
    788 	 * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
    789 	 * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
    790 	 * to NORMAL_MODE, return an error too.
    791 	 */
    792 	for (i = 0; i < 2; i++) {
    793 		ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, PRE_TEST_MODE);
    794 		AdvSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
    795 		byte = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST);
    796 		if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) !=
    797 				PRE_TEST_VALUE) {
    798 			return ASC_IERR_BIST_PRE_TEST;
    799 		}
    800 
    801 		ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, NORMAL_MODE);
    802 		AdvSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
    803 		if (ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST)
    804 		    != NORMAL_VALUE) {
    805 			return ASC_IERR_BIST_PRE_TEST;
    806 		}
    807 	}
    808 
    809 	/*
    810 	 * LRAM Test - It takes about 1.5 ms to run through the test.
    811 	 *
    812 	 * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
    813 	 * If Done bit not set or Status not 0, save register byte, set the
    814 	 * err_code, and return an error.
    815 	 */
    816 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, RAM_TEST_MODE);
    817 	AdvSleepMilliSecond(10);  /* Wait for 10ms before checking status. */
    818 
    819 	byte = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST);
    820 	if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
    821 		/* Get here if Done bit not set or Status not 0. */
    822 		return ASC_IERR_BIST_RAM_TEST;
    823 	}
    824 
    825 	/* We need to reset back to normal mode after LRAM test passes. */
    826 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_RAM_BIST, NORMAL_MODE);
    827 
    828 	/*
    829 	 * Load the Microcode
    830 	 *
    831 	 * Write the microcode image to RISC memory starting at address 0.
    832 	 *
    833 	 */
    834 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
    835 
    836 	/* Assume the following compressed format of the microcode buffer:
    837 	 *
    838 	 *  254 word (508 byte) table indexed by byte code followed
    839 	 *  by the following byte codes:
    840 	 *
    841 	 *    1-Byte Code:
    842 	 *	00: Emit word 0 in table.
    843 	 *	01: Emit word 1 in table.
    844 	 *	.
    845 	 *	FD: Emit word 253 in table.
    846 	 *
    847 	 *    Multi-Byte Code:
    848 	 *	FE WW WW: (3 byte code) Word to emit is the next word WW WW.
    849 	 *	FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
    850 	 */
    851 	word = 0;
    852 	for (i = 253 * 2; i < adv_asc38C0800_mcode_size; i++) {
    853 		if (adv_asc38C0800_mcode[i] == 0xff) {
    854 			for (j = 0; j < adv_asc38C0800_mcode[i + 1]; j++) {
    855 				ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh,
    856 				    (((u_int16_t)
    857 				    adv_asc38C0800_mcode[i + 3] << 8) |
    858 				    adv_asc38C0800_mcode[i + 2]));
    859 				word++;
    860 			}
    861 			i += 3;
    862 		} else if (adv_asc38C0800_mcode[i] == 0xfe) {
    863 			ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, (((u_int16_t)
    864 			    adv_asc38C0800_mcode[i + 2] << 8) |
    865 			    adv_asc38C0800_mcode[i + 1]));
    866 			i += 2;
    867 			word++;
    868 		} else {
    869 			ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, (((u_int16_t)
    870 			  adv_asc38C0800_mcode[(adv_asc38C0800_mcode[i] * 2) + 1] << 8) |
    871 			  adv_asc38C0800_mcode[adv_asc38C0800_mcode[i] * 2]));
    872 			word++;
    873 		}
    874 	}
    875 
    876 	/*
    877 	 * Set 'word' for later use to clear the rest of memory and save
    878 	 * the expanded mcode size.
    879 	 */
    880 	word *= 2;
    881 	adv_asc38C0800_expanded_size = word;
    882 
    883 	/*
    884 	 * Clear the rest of ASC-38C0800 Internal RAM (16KB).
    885 	 */
    886 	for (; word < ADV_38C0800_MEMSIZE; word += 2) {
    887 		ADW_WRITE_WORD_AUTO_INC_LRAM(iot, ioh, 0);
    888 	}
    889 
    890 	/*
    891 	 * Verify the microcode checksum.
    892 	 */
    893 	sum = 0;
    894 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, 0);
    895 
    896 	for (word = 0; word < adv_asc38C0800_expanded_size; word += 2) {
    897 		sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
    898 	}
    899 
    900 	if (sum != adv_asc38C0800_mcode_chksum) {
    901 	    return ASC_IERR_MCODE_CHKSUM;
    902 	}
    903 
    904 	/*
    905 	 * Restore the RISC memory BIOS region.
    906 	 */
    907 	for (i = 0; i < ASC_MC_BIOSLEN/2; i++) {
    908 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_BIOSMEM + (2 * i),
    909 				bios_mem[i]);
    910 	}
    911 
    912 	/*
    913 	 * Calculate and write the microcode code checksum to the microcode
    914 	 * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
    915 	 */
    916 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
    917 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_END_ADDR, end_addr);
    918 	code_sum = 0;
    919 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RAM_ADDR, begin_addr);
    920 	for (word = begin_addr; word < end_addr; word += 2) {
    921 		code_sum += ADW_READ_WORD_AUTO_INC_LRAM(iot, ioh);
    922 	}
    923 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CODE_CHK_SUM, code_sum);
    924 
    925 	/*
    926 	 * Read microcode version and date.
    927 	 */
    928 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_VERSION_DATE,
    929 			sc->cfg.mcode_date);
    930 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_VERSION_NUM,
    931 			sc->cfg.mcode_version);
    932 
    933 	/*
    934 	 * Set the chip type to indicate the ASC38C0800.
    935 	 */
    936 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
    937 
    938 	/*
    939 	 * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
    940 	 * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
    941 	 * cable detection and then we are able to read C_DET[3:0].
    942 	 *
    943 	 * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
    944 	 * Microcode Default Value' section below.
    945 	 */
    946 	scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
    947 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1,
    948 			scsi_cfg1 | ADW_DIS_TERM_DRV);
    949 
    950 	/*
    951 	 * If the PCI Configuration Command Register "Parity Error Response
    952 	 * Control" Bit was clear (0), then set the microcode variable
    953 	 * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
    954 	 * to ignore DMA parity errors.
    955 	 */
    956 	if (sc->cfg.control_flag & CONTROL_FLAG_IGNORE_PERR) {
    957 		/*
    958 		 * Note: Don't remove the use of a temporary variable in
    959 		 * the following code, otherwise some C compiler
    960 		 * might turn the following lines into a no-op.
    961 		 */
    962 		ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CONTROL_FLAG, word);
    963 		word |= CONTROL_FLAG_IGNORE_PERR;
    964 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_CONTROL_FLAG, word);
    965 	}
    966 
    967 	/*
    968 	 * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
    969 	 * bits for the default FIFO threshold.
    970 	 *
    971 	 * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
    972 	 *
    973 	 * For DMA Errata #4 set the BC_THRESH_ENB bit.
    974 	 */
    975 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_DMA_CFG0,
    976 		BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
    977 
    978 	/*
    979 	 * Microcode operating variables for WDTR, SDTR, and command tag
    980 	 * queuing will be set in AdvInquiryHandling() based on what a
    981 	 * device reports it is capable of in Inquiry byte 7.
    982 	 *
    983 	 * If SCSI Bus Resets have been disabled, then directly set
    984 	 * SDTR and WDTR from the EEPROM configuration. This will allow
    985 	 * the BIOS and warm boot to work without a SCSI bus hang on
    986 	 * the Inquiry caused by host and target mismatched DTR values.
    987 	 * Without the SCSI Bus Reset, before an Inquiry a device can't
    988 	 * be assumed to be in Asynchronous, Narrow mode.
    989 	 */
    990 	if ((sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
    991 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, sc->wdtr_able);
    992 		ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sc->sdtr_able);
    993 	}
    994 
    995 	/*
    996 	 * Set microcode operating variables for DISC and SDTR_SPEED1,
    997 	 * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
    998 	 * configuration values.
    999 	 *
   1000 	 * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
   1001 	 * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
   1002 	 * without determining here whether the device supports SDTR.
   1003 	 */
   1004 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DISC_ENABLE, sc->cfg.disc_enable);
   1005 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED1, sc->sdtr_speed1);
   1006 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED2, sc->sdtr_speed2);
   1007 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED3, sc->sdtr_speed3);
   1008 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_SPEED4, sc->sdtr_speed4);
   1009 
   1010 	/*
   1011 	 * Set SCSI_CFG0 Microcode Default Value.
   1012 	 *
   1013 	 * The microcode will set the SCSI_CFG0 register using this value
   1014 	 * after it is started below.
   1015 	 */
   1016 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SCSI_CFG0,
   1017 		ADW_PARITY_EN | ADW_SEL_TMO_LONG | ADW_OUR_ID_EN |
   1018 			sc->chip_scsi_id);
   1019 
   1020 	/*
   1021 	 * Determine SCSI_CFG1 Microcode Default Value.
   1022 	 *
   1023 	 * The microcode will set the SCSI_CFG1 register using this value
   1024 	 * after it is started below.
   1025 	 */
   1026 
   1027 	/* Read current SCSI_CFG1 Register value. */
   1028 	scsi_cfg1 = ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CFG1);
   1029 
   1030 	/*
   1031 	 * If the internal narrow cable is reversed all of the SCSI_CTRL
   1032 	 * register signals will be set. Check for and return an error if
   1033 	 * this condition is found.
   1034 	 */
   1035 	if ((ADW_READ_WORD_REGISTER(iot, ioh, IOPW_SCSI_CTRL) & 0x3F07) ==
   1036 			0x3F07) {
   1037 		return ASC_IERR_REVERSED_CABLE;
   1038 	}
   1039 
   1040 	/*
   1041 	 * All kind of combinations of devices attached to one of four connectors
   1042 	 * are acceptable except HVD device attached. For example, LVD device can
   1043 	 * be attached to SE connector while SE device attached to LVD connector.
   1044 	 * If LVD device attached to SE connector, it only runs up to Ultra speed.
   1045 	 *
   1046 	 * If an HVD device is attached to one of LVD connectors, return an error.
   1047 	 * However, there is no way to detect HVD device attached to SE connectors.
   1048 	 */
   1049 	if (scsi_cfg1 & ADW_HVD) {
   1050 		return ASC_IERR_HVD_DEVICE;
   1051 	}
   1052 
   1053 	/*
   1054 	 * If either SE or LVD automatic termination control is enabled, then
   1055 	 * set the termination value based on a table listed in a_condor.h.
   1056 	 *
   1057 	 * If manual termination was specified with an EEPROM setting then
   1058 	 * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready to
   1059 	 * be 'ored' into SCSI_CFG1.
   1060 	 */
   1061 	if ((sc->cfg.termination & ADW_TERM_SE) == 0) {
   1062 		/* SE automatic termination control is enabled. */
   1063 		switch(scsi_cfg1 & ADW_C_DET_SE) {
   1064 			/* TERM_SE_HI: on, TERM_SE_LO: on */
   1065 			case 0x1: case 0x2: case 0x3:
   1066 				sc->cfg.termination |= ADW_TERM_SE;
   1067 				break;
   1068 
   1069 			/* TERM_SE_HI: on, TERM_SE_LO: off */
   1070 			case 0x0:
   1071 				sc->cfg.termination |= ADW_TERM_SE_HI;
   1072 				break;
   1073 		}
   1074 	}
   1075 
   1076 	if ((sc->cfg.termination & ADW_TERM_LVD) == 0) {
   1077 		/* LVD automatic termination control is enabled. */
   1078 		switch(scsi_cfg1 & ADW_C_DET_LVD) {
   1079 			/* TERM_LVD_HI: on, TERM_LVD_LO: on */
   1080 			case 0x4: case 0x8: case 0xC:
   1081 				sc->cfg.termination |= ADW_TERM_LVD;
   1082 				break;
   1083 
   1084 			/* TERM_LVD_HI: off, TERM_LVD_LO: off */
   1085 			case 0x0:
   1086 				break;
   1087 		}
   1088 	}
   1089 
   1090 	/*
   1091 	 * Clear any set TERM_SE and TERM_LVD bits.
   1092 	 */
   1093 	scsi_cfg1 &= (~ADW_TERM_SE & ~ADW_TERM_LVD);
   1094 
   1095 	/*
   1096 	 * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
   1097 	 */
   1098 	scsi_cfg1 |= (~sc->cfg.termination & 0xF0);
   1099 
   1100 	/*
   1101 	 * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE bits
   1102 	 * and set possibly modified termination control bits in the Microcode
   1103 	 * SCSI_CFG1 Register Value.
   1104 	 */
   1105 	scsi_cfg1 &= (~ADW_BIG_ENDIAN & ~ADW_DIS_TERM_DRV &
   1106 			~ADW_TERM_POL & ~ADW_HVD_LVD_SE);
   1107 
   1108 	/*
   1109 	 * Set SCSI_CFG1 Microcode Default Value
   1110 	 *
   1111 	 * Set possibly modified termination control and reset DIS_TERM_DRV
   1112 	 * bits in the Microcode SCSI_CFG1 Register Value.
   1113 	 *
   1114 	 * The microcode will set the SCSI_CFG1 register using this value
   1115 	 * after it is started below.
   1116 	 */
   1117 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
   1118 
   1119 	/*
   1120 	 * Set MEM_CFG Microcode Default Value
   1121 	 *
   1122 	 * The microcode will set the MEM_CFG register using this value
   1123 	 * after it is started below.
   1124 	 *
   1125 	 * MEM_CFG may be accessed as a word or byte, but only bits 0-7
   1126 	 * are defined.
   1127 	 *
   1128 	 * ASC-38C0800 has 16KB internal memory.
   1129 	 */
   1130 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_MEM_CFG,
   1131 		ADW_BIOS_EN | ADW_RAM_SZ_16KB);
   1132 
   1133 	/*
   1134 	 * Set SEL_MASK Microcode Default Value
   1135 	 *
   1136 	 * The microcode will set the SEL_MASK register using this value
   1137 	 * after it is started below.
   1138 	 */
   1139 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_DEFAULT_SEL_MASK,
   1140 		ADW_TID_TO_TIDMASK(sc->chip_scsi_id));
   1141 
   1142 
   1143 	/*
   1144 	 * Set-up the Host->RISC Initiator Command Queue (ICQ).
   1145 	 */
   1146 
   1147 	if ((sc->icq_sp = sc->carr_freelist) == NULL) {
   1148 		return ASC_IERR_NO_CARRIER;
   1149 	}
   1150 	sc->carr_freelist = adw_carrier_phys_kv(sc,
   1151 			ASC_GET_CARRP(sc->icq_sp->next_vpa));
   1152 
   1153 
   1154 	/*
   1155 	 * The first command issued will be placed in the stopper carrier.
   1156 	 */
   1157 	sc->icq_sp->next_vpa = ASC_CQ_STOPPER;
   1158 
   1159 	/*
   1160 	 * Set RISC ICQ physical address start value.
   1161 	 */
   1162 	ADW_WRITE_DWORD_LRAM(iot, ioh, ASC_MC_ICQ, sc->icq_sp->carr_pa);
   1163 
   1164 	/*
   1165 	 * Set-up the RISC->Host Initiator Response Queue (IRQ).
   1166 	 */
   1167 	if ((sc->irq_sp = sc->carr_freelist) == NULL) {
   1168 		return ASC_IERR_NO_CARRIER;
   1169 	}
   1170 	sc->carr_freelist = adw_carrier_phys_kv(sc,
   1171 			ASC_GET_CARRP(sc->irq_sp->next_vpa));
   1172 
   1173 	/*
   1174 	 * The first command completed by the RISC will be placed in
   1175 	 * the stopper.
   1176 	 *
   1177 	 * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
   1178 	 * completed the RISC will set the ASC_RQ_STOPPER bit.
   1179 	 */
   1180 	sc->irq_sp->next_vpa = ASC_CQ_STOPPER;
   1181 
   1182 	/*
   1183 	 * Set RISC IRQ physical address start value.
   1184 	 */
   1185 	ADW_WRITE_DWORD_LRAM(iot, ioh, ASC_MC_IRQ, sc->irq_sp->carr_pa);
   1186 	sc->carr_pending_cnt = 0;
   1187 
   1188 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_INTR_ENABLES,
   1189 		(ADW_INTR_ENABLE_HOST_INTR | ADW_INTR_ENABLE_GLOBAL_INTR));
   1190 	/*
   1191 	 * Note: Don't remove the use of a temporary variable in
   1192 	 * the following code, otherwise some C compiler
   1193 	 * might turn the following lines into a no-op.
   1194 	 */
   1195 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_CODE_BEGIN_ADDR, word);
   1196 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_PC, word);
   1197 
   1198 	/* finally, finally, gentlemen, start your engine */
   1199 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RISC_CSR, ADW_RISC_CSR_RUN);
   1200 
   1201 	/*
   1202 	 * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
   1203 	 * Resets should be performed. The RISC has to be running
   1204 	 * to issue a SCSI Bus Reset.
   1205 	 */
   1206 	if (sc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
   1207 		/*
   1208 		 * If the BIOS Signature is present in memory, restore the
   1209 		 * BIOS Handshake Configuration Table and do not perform
   1210 		 * a SCSI Bus Reset.
   1211 		 */
   1212 		if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] ==
   1213 				0x55AA) {
   1214 			/*
   1215 			 * Restore per TID negotiated values.
   1216 			 */
   1217 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, wdtr_able);
   1218 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sdtr_able);
   1219 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE,
   1220 					tagqng_able);
   1221 			for (tid = 0; tid <= ADW_MAX_TID; tid++) {
   1222 				ADW_WRITE_BYTE_LRAM(iot, ioh,
   1223 						ASC_MC_NUMBER_OF_MAX_CMD + tid,
   1224 						max_cmd[tid]);
   1225 			}
   1226 		} else {
   1227 			if (AdvResetCCB(sc) != ADW_TRUE) {
   1228 				warn_code = ASC_WARN_BUSRESET_ERROR;
   1229 			}
   1230 		}
   1231 	}
   1232 
   1233 	return warn_code;
   1234 }
   1235 
   1236 
   1237 /*
   1238  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
   1239  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
   1240  * all of this is done.
   1241  *
   1242  * On failure set the ADV_DVC_VAR field 'err_code' and return ADW_ERROR.
   1243  *
   1244  * For a non-fatal error return a warning code. If there are no warnings
   1245  * then 0 is returned.
   1246  *
   1247  * Note: Chip is stopped on entry.
   1248  */
   1249 int
   1250 AdvInitFrom3550EEP(sc)
   1251 ADW_SOFTC      *sc;
   1252 {
   1253 	bus_space_tag_t iot = sc->sc_iot;
   1254 	bus_space_handle_t ioh = sc->sc_ioh;
   1255 	u_int16_t		warn_code;
   1256 	ADW_EEP_3550_CONFIG	eep_config;
   1257 	int			i;
   1258 
   1259 
   1260 	warn_code = 0;
   1261 
   1262 	/*
   1263 	 * Read the board's EEPROM configuration.
   1264 	 *
   1265 	 * Set default values if a bad checksum is found.
   1266 	 */
   1267 	if (AdvGet3550EEPConfig(iot, ioh, &eep_config) != eep_config.check_sum){
   1268 		warn_code |= ASC_WARN_EEPROM_CHKSUM;
   1269 
   1270 		/*
   1271 		 * Set EEPROM default values.
   1272 		 */
   1273 		for (i = 0; i < sizeof(ADW_EEP_3550_CONFIG); i++) {
   1274 			*((u_int8_t *) &eep_config + i) =
   1275 				*((u_int8_t *) &Default_3550_EEPROM_Config + i);
   1276 		}
   1277 
   1278 		/*
   1279 		 * Assume the 6 byte board serial number that was read
   1280 		 * from EEPROM is correct even if the EEPROM checksum
   1281 		 * failed.
   1282 		 */
   1283 		eep_config.serial_number_word3 =
   1284 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 1);
   1285 
   1286 		eep_config.serial_number_word2 =
   1287 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 2);
   1288 
   1289 		eep_config.serial_number_word1 =
   1290 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 3);
   1291 
   1292 		AdvSet3550EEPConfig(iot, ioh, &eep_config);
   1293 	}
   1294 	/*
   1295 	 * Set sc_VAR and sc_CFG variables from the
   1296 	 * EEPROM configuration that was read.
   1297 	 *
   1298 	 * This is the mapping of EEPROM fields to Adv Library fields.
   1299 	 */
   1300 	sc->wdtr_able = eep_config.wdtr_able;
   1301 	sc->sdtr_able = eep_config.sdtr_able;
   1302 	sc->ultra_able = eep_config.ultra_able;
   1303 	sc->tagqng_able = eep_config.tagqng_able;
   1304 	sc->cfg.disc_enable = eep_config.disc_enable;
   1305 	sc->max_host_qng = eep_config.max_host_qng;
   1306 	sc->max_dvc_qng = eep_config.max_dvc_qng;
   1307 	sc->chip_scsi_id = (eep_config.adapter_scsi_id & ADW_MAX_TID);
   1308 	sc->start_motor = eep_config.start_motor;
   1309 	sc->scsi_reset_wait = eep_config.scsi_reset_delay;
   1310 	sc->bios_ctrl = eep_config.bios_ctrl;
   1311 	sc->no_scam = eep_config.scam_tolerant;
   1312 	sc->cfg.serial1 = eep_config.serial_number_word1;
   1313 	sc->cfg.serial2 = eep_config.serial_number_word2;
   1314 	sc->cfg.serial3 = eep_config.serial_number_word3;
   1315 
   1316 	/*
   1317 	 * Set the host maximum queuing (max. 253, min. 16) and the per device
   1318 	 * maximum queuing (max. 63, min. 4).
   1319 	 */
   1320 	if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
   1321 		eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
   1322 	} else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
   1323 	{
   1324 		/* If the value is zero, assume it is uninitialized. */
   1325 		if (eep_config.max_host_qng == 0) {
   1326 			eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
   1327 		} else {
   1328 			eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
   1329 		}
   1330 	}
   1331 
   1332 	if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
   1333 		eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
   1334 	} else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
   1335 		/* If the value is zero, assume it is uninitialized. */
   1336 		if (eep_config.max_dvc_qng == 0) {
   1337 			eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
   1338 		} else {
   1339 			eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
   1340 		}
   1341 	}
   1342 
   1343 	/*
   1344 	 * If 'max_dvc_qng' is greater than 'max_host_qng', then
   1345 	 * set 'max_dvc_qng' to 'max_host_qng'.
   1346 	 */
   1347 	if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
   1348 		eep_config.max_dvc_qng = eep_config.max_host_qng;
   1349 	}
   1350 
   1351 	/*
   1352 	 * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
   1353 	 * values based on possibly adjusted EEPROM values.
   1354 	 */
   1355 	sc->max_host_qng = eep_config.max_host_qng;
   1356 	sc->max_dvc_qng = eep_config.max_dvc_qng;
   1357 
   1358 
   1359 	/*
   1360 	 * If the EEPROM 'termination' field is set to automatic (0), then set
   1361 	 * the ADV_DVC_CFG 'termination' field to automatic also.
   1362 	 *
   1363 	 * If the termination is specified with a non-zero 'termination'
   1364 	 * value check that a legal value is set and set the ADV_DVC_CFG
   1365 	 * 'termination' field appropriately.
   1366 	 */
   1367 	if (eep_config.termination == 0) {
   1368 		sc->cfg.termination = 0;    /* auto termination */
   1369 	} else {
   1370 		/* Enable manual control with low off / high off. */
   1371 		if (eep_config.termination == 1) {
   1372 			sc->cfg.termination = ADW_TERM_CTL_SEL;
   1373 
   1374 		/* Enable manual control with low off / high on. */
   1375 		} else if (eep_config.termination == 2) {
   1376 			sc->cfg.termination = ADW_TERM_CTL_SEL | ADW_TERM_CTL_H;
   1377 
   1378 		/* Enable manual control with low on / high on. */
   1379 		} else if (eep_config.termination == 3) {
   1380 			sc->cfg.termination = ADW_TERM_CTL_SEL |
   1381 					ADW_TERM_CTL_H | ADW_TERM_CTL_L;
   1382 		} else {
   1383 			/*
   1384 			 * The EEPROM 'termination' field contains a bad value. Use
   1385 			 * automatic termination instead.
   1386 			 */
   1387 			sc->cfg.termination = 0;
   1388 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
   1389 		}
   1390 	}
   1391 
   1392 	return warn_code;
   1393 }
   1394 
   1395 
   1396 /*
   1397  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
   1398  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
   1399  * all of this is done.
   1400  *
   1401  * On failure set the ADV_DVC_VAR field 'err_code' and return ADW_ERROR.
   1402  *
   1403  * For a non-fatal error return a warning code. If there are no warnings
   1404  * then 0 is returned.
   1405  *
   1406  * Note: Chip is stopped on entry.
   1407  */
   1408 int
   1409 AdvInitFrom38C0800EEP(sc)
   1410 ADW_SOFTC      *sc;
   1411 {
   1412 	bus_space_tag_t iot = sc->sc_iot;
   1413 	bus_space_handle_t ioh = sc->sc_ioh;
   1414 	u_int16_t		warn_code;
   1415 	ADW_EEP_38C0800_CONFIG	eep_config;
   1416 	int			i;
   1417 	u_int8_t		tid, termination;
   1418 	u_int16_t		sdtr_speed = 0;
   1419 
   1420 
   1421 	warn_code = 0;
   1422 
   1423 	/*
   1424 	 * Read the board's EEPROM configuration.
   1425 	 *
   1426 	 * Set default values if a bad checksum is found.
   1427 	 */
   1428 	if (AdvGet38C0800EEPConfig(iot, ioh, &eep_config) !=
   1429 			eep_config.check_sum) {
   1430 		warn_code |= ASC_WARN_EEPROM_CHKSUM;
   1431 
   1432 		/*
   1433 		 * Set EEPROM default values.
   1434 		 */
   1435 		for (i = 0; i < sizeof(ADW_EEP_38C0800_CONFIG); i++) {
   1436 			*((u_int8_t *) &eep_config + i) =
   1437 				*((u_int8_t *)&Default_38C0800_EEPROM_Config+i);
   1438 		}
   1439 
   1440 		/*
   1441 		 * Assume the 6 byte board serial number that was read
   1442 		 * from EEPROM is correct even if the EEPROM checksum
   1443 		 * failed.
   1444 		 */
   1445 		eep_config.serial_number_word3 =
   1446 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 1);
   1447 
   1448 		eep_config.serial_number_word2 =
   1449 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 2);
   1450 
   1451 		eep_config.serial_number_word1 =
   1452 			AdvReadEEPWord(iot, ioh, ASC_EEP_DVC_CFG_END - 3);
   1453 
   1454 		AdvSet38C0800EEPConfig(iot, ioh, &eep_config);
   1455 	}
   1456 	/*
   1457 	 * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
   1458 	 * EEPROM configuration that was read.
   1459 	 *
   1460 	 * This is the mapping of EEPROM fields to Adv Library fields.
   1461 	 */
   1462 	sc->wdtr_able = eep_config.wdtr_able;
   1463 	sc->sdtr_speed1 = eep_config.sdtr_speed1;
   1464 	sc->sdtr_speed2 = eep_config.sdtr_speed2;
   1465 	sc->sdtr_speed3 = eep_config.sdtr_speed3;
   1466 	sc->sdtr_speed4 = eep_config.sdtr_speed4;
   1467 	sc->tagqng_able = eep_config.tagqng_able;
   1468 	sc->cfg.disc_enable = eep_config.disc_enable;
   1469 	sc->max_host_qng = eep_config.max_host_qng;
   1470 	sc->max_dvc_qng = eep_config.max_dvc_qng;
   1471 	sc->chip_scsi_id = (eep_config.adapter_scsi_id & ADW_MAX_TID);
   1472 	sc->start_motor = eep_config.start_motor;
   1473 	sc->scsi_reset_wait = eep_config.scsi_reset_delay;
   1474 	sc->bios_ctrl = eep_config.bios_ctrl;
   1475 	sc->no_scam = eep_config.scam_tolerant;
   1476 	sc->cfg.serial1 = eep_config.serial_number_word1;
   1477 	sc->cfg.serial2 = eep_config.serial_number_word2;
   1478 	sc->cfg.serial3 = eep_config.serial_number_word3;
   1479 
   1480 	/*
   1481 	 * For every Target ID if any of its 'sdtr_speed[1234]' bits
   1482 	 * are set, then set an 'sdtr_able' bit for it.
   1483 	 */
   1484 	sc->sdtr_able = 0;
   1485 	for (tid = 0; tid <= ADW_MAX_TID; tid++) {
   1486 		if (tid == 0) {
   1487 			sdtr_speed = sc->sdtr_speed1;
   1488 		} else if (tid == 4) {
   1489 			sdtr_speed = sc->sdtr_speed2;
   1490 		} else if (tid == 8) {
   1491 			sdtr_speed = sc->sdtr_speed3;
   1492 		} else if (tid == 12) {
   1493 			sdtr_speed = sc->sdtr_speed4;
   1494 		}
   1495 		if (sdtr_speed & ADW_MAX_TID) {
   1496 			sc->sdtr_able |= (1 << tid);
   1497 		}
   1498 		sdtr_speed >>= 4;
   1499 	}
   1500 
   1501 	/*
   1502 	 * Set the host maximum queuing (max. 253, min. 16) and the per device
   1503 	 * maximum queuing (max. 63, min. 4).
   1504 	 */
   1505 	if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
   1506 		eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
   1507 	} else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
   1508 		/* If the value is zero, assume it is uninitialized. */
   1509 		if (eep_config.max_host_qng == 0) {
   1510 			eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
   1511 		} else {
   1512 			eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
   1513 		}
   1514 	}
   1515 
   1516 	if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
   1517 		eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
   1518 	} else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
   1519 		/* If the value is zero, assume it is uninitialized. */
   1520 		if (eep_config.max_dvc_qng == 0) {
   1521 			eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
   1522 		} else {
   1523 			eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
   1524 		}
   1525 	}
   1526 
   1527 	/*
   1528 	 * If 'max_dvc_qng' is greater than 'max_host_qng', then
   1529 	 * set 'max_dvc_qng' to 'max_host_qng'.
   1530 	 */
   1531 	if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
   1532 		eep_config.max_dvc_qng = eep_config.max_host_qng;
   1533 	}
   1534 
   1535 	/*
   1536 	 * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
   1537 	 * values based on possibly adjusted EEPROM values.
   1538 	 */
   1539 	sc->max_host_qng = eep_config.max_host_qng;
   1540 	sc->max_dvc_qng = eep_config.max_dvc_qng;
   1541 
   1542 	/*
   1543 	 * If the EEPROM 'termination' field is set to automatic (0), then set
   1544 	 * the ADV_DVC_CFG 'termination' field to automatic also.
   1545 	 *
   1546 	 * If the termination is specified with a non-zero 'termination'
   1547 	 * value check that a legal value is set and set the ADV_DVC_CFG
   1548 	 * 'termination' field appropriately.
   1549 	 */
   1550 	if (eep_config.termination_se == 0) {
   1551 		termination = 0;	/* auto termination for SE */
   1552 	} else {
   1553 		/* Enable manual control with low off / high off. */
   1554 		if (eep_config.termination_se == 1) {
   1555 			termination = 0;
   1556 
   1557 		/* Enable manual control with low off / high on. */
   1558 		} else if (eep_config.termination_se == 2) {
   1559 			termination = ADW_TERM_SE_HI;
   1560 
   1561 		/* Enable manual control with low on / high on. */
   1562 		} else if (eep_config.termination_se == 3) {
   1563 			termination = ADW_TERM_SE;
   1564 		} else {
   1565 			/*
   1566 			 * The EEPROM 'termination_se' field contains
   1567 			 * a bad value.
   1568 			 * Use automatic termination instead.
   1569 			 */
   1570 			termination = 0;
   1571 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
   1572 		}
   1573 	}
   1574 
   1575 	if (eep_config.termination_lvd == 0) {
   1576 		/* auto termination for LVD */
   1577 		sc->cfg.termination = termination;
   1578 	} else
   1579 	{
   1580 		/* Enable manual control with low off / high off. */
   1581 		if (eep_config.termination_lvd == 1) {
   1582 			sc->cfg.termination = termination;
   1583 
   1584 		/* Enable manual control with low off / high on. */
   1585 		} else if (eep_config.termination_lvd == 2) {
   1586 			sc->cfg.termination = termination | ADW_TERM_LVD_HI;
   1587 
   1588 		/* Enable manual control with low on / high on. */
   1589 		} else if (eep_config.termination_lvd == 3) {
   1590 			sc->cfg.termination = termination | ADW_TERM_LVD;
   1591 		} else {
   1592 			/*
   1593 			 * The EEPROM 'termination_lvd' field contains a bad value.
   1594 			 * Use automatic termination instead.
   1595 			 */
   1596 			sc->cfg.termination = termination;
   1597 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
   1598 		}
   1599 	}
   1600 
   1601 	return warn_code;
   1602 }
   1603 
   1604 
   1605 /*
   1606  * Read EEPROM configuration into the specified buffer.
   1607  *
   1608  * Return a checksum based on the EEPROM configuration read.
   1609  */
   1610 static u_int16_t
   1611 AdvGet3550EEPConfig(iot, ioh, cfg_buf)
   1612 	bus_space_tag_t		iot;
   1613 	bus_space_handle_t	ioh;
   1614 	ADW_EEP_3550_CONFIG	*cfg_buf;
   1615 {
   1616 	u_int16_t	       wval, chksum;
   1617 	u_int16_t	       *wbuf;
   1618 	int		    eep_addr;
   1619 
   1620 
   1621 	wbuf = (u_int16_t *) cfg_buf;
   1622 	chksum = 0;
   1623 
   1624 	for (eep_addr = ASC_EEP_DVC_CFG_BEGIN;
   1625 			eep_addr < ASC_EEP_DVC_CFG_END;
   1626 			eep_addr++, wbuf++) {
   1627 		wval = AdvReadEEPWord(iot, ioh, eep_addr);
   1628 		chksum += wval;
   1629 		*wbuf = wval;
   1630 	}
   1631 
   1632 	*wbuf = AdvReadEEPWord(iot, ioh, eep_addr);
   1633 	wbuf++;
   1634 	for (eep_addr = ASC_EEP_DVC_CTL_BEGIN;
   1635 			eep_addr < ASC_EEP_MAX_WORD_ADDR;
   1636 			eep_addr++, wbuf++) {
   1637 		*wbuf = AdvReadEEPWord(iot, ioh, eep_addr);
   1638 	}
   1639 
   1640 	return chksum;
   1641 }
   1642 
   1643 
   1644 /*
   1645  * Read EEPROM configuration into the specified buffer.
   1646  *
   1647  * Return a checksum based on the EEPROM configuration read.
   1648  */
   1649 static u_int16_t
   1650 AdvGet38C0800EEPConfig(iot, ioh, cfg_buf)
   1651 	bus_space_tag_t		iot;
   1652 	bus_space_handle_t	ioh;
   1653 	ADW_EEP_38C0800_CONFIG	*cfg_buf;
   1654 {
   1655 	u_int16_t	wval, chksum;
   1656 	u_int16_t	*wbuf;
   1657 	int		eep_addr;
   1658 
   1659 
   1660 	wbuf = (u_int16_t *) cfg_buf;
   1661 	chksum = 0;
   1662 
   1663 	for (eep_addr = ASC_EEP_DVC_CFG_BEGIN;
   1664 			eep_addr < ASC_EEP_DVC_CFG_END;
   1665 			eep_addr++, wbuf++) {
   1666 		wval = AdvReadEEPWord(iot, ioh, eep_addr);
   1667 		chksum += wval;
   1668 		*wbuf = wval;
   1669 	}
   1670 
   1671 	*wbuf = AdvReadEEPWord(iot, ioh, eep_addr);
   1672 	wbuf++;
   1673 	for (eep_addr = ASC_EEP_DVC_CTL_BEGIN;
   1674 			eep_addr < ASC_EEP_MAX_WORD_ADDR;
   1675 			eep_addr++, wbuf++) {
   1676 		*wbuf = AdvReadEEPWord(iot, ioh, eep_addr);
   1677 	}
   1678 
   1679 	return chksum;
   1680 }
   1681 
   1682 
   1683 /*
   1684  * Read the EEPROM from specified location
   1685  */
   1686 static u_int16_t
   1687 AdvReadEEPWord(iot, ioh, eep_word_addr)
   1688 	bus_space_tag_t		iot;
   1689 	bus_space_handle_t	ioh;
   1690 	int			eep_word_addr;
   1691 {
   1692 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1693 		ASC_EEP_CMD_READ | eep_word_addr);
   1694 	AdvWaitEEPCmd(iot, ioh);
   1695 
   1696 	return ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_DATA);
   1697 }
   1698 
   1699 
   1700 /*
   1701  * Wait for EEPROM command to complete
   1702  */
   1703 static void
   1704 AdvWaitEEPCmd(iot, ioh)
   1705 	bus_space_tag_t		iot;
   1706 	bus_space_handle_t	ioh;
   1707 {
   1708 	int eep_delay_ms;
   1709 
   1710 
   1711 	for (eep_delay_ms = 0; eep_delay_ms < ASC_EEP_DELAY_MS; eep_delay_ms++){
   1712 		if (ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_CMD) &
   1713 				ASC_EEP_CMD_DONE) {
   1714 			break;
   1715 		}
   1716 		AdvSleepMilliSecond(1);
   1717 	}
   1718 
   1719 	ADW_READ_WORD_REGISTER(iot, ioh, IOPW_EE_CMD);
   1720 }
   1721 
   1722 
   1723 /*
   1724  * Write the EEPROM from 'cfg_buf'.
   1725  */
   1726 static void
   1727 AdvSet3550EEPConfig(iot, ioh, cfg_buf)
   1728 	bus_space_tag_t		iot;
   1729 	bus_space_handle_t	ioh;
   1730 	ADW_EEP_3550_CONFIG	*cfg_buf;
   1731 {
   1732 	u_int16_t *wbuf;
   1733 	u_int16_t addr, chksum;
   1734 
   1735 
   1736 	wbuf = (u_int16_t *) cfg_buf;
   1737 	chksum = 0;
   1738 
   1739 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
   1740 	AdvWaitEEPCmd(iot, ioh);
   1741 
   1742 	/*
   1743 	 * Write EEPROM from word 0 to word 20
   1744 	 */
   1745 	for (addr = ASC_EEP_DVC_CFG_BEGIN;
   1746 	     addr < ASC_EEP_DVC_CFG_END; addr++, wbuf++) {
   1747 		chksum += *wbuf;
   1748 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
   1749 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1750 				ASC_EEP_CMD_WRITE | addr);
   1751 		AdvWaitEEPCmd(iot, ioh);
   1752 		AdvSleepMilliSecond(ASC_EEP_DELAY_MS);
   1753 	}
   1754 
   1755 	/*
   1756 	 * Write EEPROM checksum at word 21
   1757 	 */
   1758 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, chksum);
   1759 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1760 			ASC_EEP_CMD_WRITE | addr);
   1761 	AdvWaitEEPCmd(iot, ioh);
   1762 	wbuf++;        /* skip over check_sum */
   1763 
   1764 	/*
   1765 	 * Write EEPROM OEM name at words 22 to 29
   1766 	 */
   1767 	for (addr = ASC_EEP_DVC_CTL_BEGIN;
   1768 	     addr < ASC_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
   1769 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
   1770 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1771 				ASC_EEP_CMD_WRITE | addr);
   1772 		AdvWaitEEPCmd(iot, ioh);
   1773 	}
   1774 
   1775 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1776 			ASC_EEP_CMD_WRITE_DISABLE);
   1777 	AdvWaitEEPCmd(iot, ioh);
   1778 
   1779 	return;
   1780 }
   1781 
   1782 
   1783 /*
   1784  * Write the EEPROM from 'cfg_buf'.
   1785  */
   1786 static void
   1787 AdvSet38C0800EEPConfig(iot, ioh, cfg_buf)
   1788 	bus_space_tag_t		iot;
   1789 	bus_space_handle_t	ioh;
   1790 	ADW_EEP_38C0800_CONFIG	*cfg_buf;
   1791 {
   1792 	u_int16_t *wbuf;
   1793 	u_int16_t addr, chksum;
   1794 
   1795 
   1796 	wbuf = (u_int16_t *) cfg_buf;
   1797 	chksum = 0;
   1798 
   1799 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
   1800 	AdvWaitEEPCmd(iot, ioh);
   1801 
   1802 	/*
   1803 	 * Write EEPROM from word 0 to word 20
   1804 	 */
   1805 	for (addr = ASC_EEP_DVC_CFG_BEGIN;
   1806 	     addr < ASC_EEP_DVC_CFG_END; addr++, wbuf++) {
   1807 		chksum += *wbuf;
   1808 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
   1809 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1810 				ASC_EEP_CMD_WRITE | addr);
   1811 		AdvWaitEEPCmd(iot, ioh);
   1812 		AdvSleepMilliSecond(ASC_EEP_DELAY_MS);
   1813 	}
   1814 
   1815 	/*
   1816 	 * Write EEPROM checksum at word 21
   1817 	 */
   1818 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, chksum);
   1819 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1820 			ASC_EEP_CMD_WRITE | addr);
   1821 	AdvWaitEEPCmd(iot, ioh);
   1822 	wbuf++;        /* skip over check_sum */
   1823 
   1824 	/*
   1825 	 * Write EEPROM OEM name at words 22 to 29
   1826 	 */
   1827 	for (addr = ASC_EEP_DVC_CTL_BEGIN;
   1828 	     addr < ASC_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
   1829 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_DATA, *wbuf);
   1830 		ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1831 				ASC_EEP_CMD_WRITE | addr);
   1832 		AdvWaitEEPCmd(iot, ioh);
   1833 	}
   1834 
   1835 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_EE_CMD,
   1836 			ASC_EEP_CMD_WRITE_DISABLE);
   1837 	AdvWaitEEPCmd(iot, ioh);
   1838 
   1839 	return;
   1840 }
   1841 
   1842 
   1843 /*
   1844  * AdvExeScsiQueue() - Send a request to the RISC microcode program.
   1845  *
   1846  *   Allocate a carrier structure, point the carrier to the ADW_SCSI_REQ_Q,
   1847  *   add the carrier to the ICQ (Initiator Command Queue), and tickle the
   1848  *   RISC to notify it a new command is ready to be executed.
   1849  *
   1850  * If 'done_status' is not set to QD_DO_RETRY, then 'error_retry' will be
   1851  * set to SCSI_MAX_RETRY.
   1852  *
   1853  * Return:
   1854  *      ADW_SUCCESS(1) - The request was successfully queued.
   1855  *      ADW_BUSY(0) -    Resource unavailable; Retry again after pending
   1856  *                       request completes.
   1857  *      ADW_ERROR(-1) -  Invalid ADW_SCSI_REQ_Q request structure
   1858  *                       host IC error.
   1859  */
   1860 int
   1861 AdvExeScsiQueue(sc, scsiq)
   1862 ADW_SOFTC	*sc;
   1863 ADW_SCSI_REQ_Q	*scsiq;
   1864 {
   1865 	bus_space_tag_t iot = sc->sc_iot;
   1866 	bus_space_handle_t ioh = sc->sc_ioh;
   1867 	ADW_CCB		*ccb;
   1868 	long		req_size;
   1869 	u_int32_t	req_paddr;
   1870 	ADW_CARRIER	*new_carrp/*, *ccb_carr;
   1871 	int		i*/;
   1872 
   1873 
   1874 	/*
   1875 	 * The ADW_SCSI_REQ_Q 'target_id' field should never exceed ADW_MAX_TID.
   1876 	 */
   1877 	if (scsiq->target_id > ADW_MAX_TID) {
   1878 		scsiq->host_status = QHSTA_M_INVALID_DEVICE;
   1879 		scsiq->done_status = QD_WITH_ERROR;
   1880 		return ADW_ERROR;
   1881 	}
   1882 
   1883 	ccb = adw_ccb_phys_kv(sc, scsiq->ccb_ptr);
   1884 	ccb->carr_list = sc->icq_sp;
   1885 
   1886 	/*
   1887 	 * Allocate a carrier ensuring at least one carrier always
   1888 	 * remains on the freelist and initialize fields.
   1889 	 */
   1890 	if ((new_carrp = sc->carr_freelist) == NULL) {
   1891 		return ADW_BUSY;
   1892 	}
   1893 	sc->carr_freelist = adw_carrier_phys_kv(sc,
   1894 			ASC_GET_CARRP(new_carrp->next_vpa));
   1895 	sc->carr_pending_cnt++;
   1896 
   1897 	/*
   1898 	 * Set the carrier to be a stopper by setting 'next_vpa'
   1899 	 * to the stopper value. The current stopper will be changed
   1900 	 * below to point to the new stopper.
   1901 	 */
   1902 	new_carrp->next_vpa = ASC_CQ_STOPPER;
   1903 
   1904 	req_size = sizeof(ADW_SCSI_REQ_Q);
   1905 	req_paddr = sc->sc_dmamap_control->dm_segs[0].ds_addr +
   1906 		ADW_CCB_OFF(ccb) + offsetof(struct adw_ccb, scsiq);
   1907 
   1908 	/* Save physical address of ADW_SCSI_REQ_Q and Carrier. */
   1909 	scsiq->scsiq_rptr = req_paddr;
   1910 
   1911 	/*
   1912 	 * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
   1913 	 * order during initialization.
   1914 	 */
   1915 	scsiq->carr_pa = sc->icq_sp->carr_pa;
   1916 	scsiq->carr_va = sc->icq_sp->carr_pa;
   1917 
   1918 	/*
   1919 	 * Use the current stopper to send the ADW_SCSI_REQ_Q command to
   1920 	 * the microcode. The newly allocated stopper will become the new
   1921 	 * stopper.
   1922 	 */
   1923 	sc->icq_sp->areq_vpa = req_paddr;
   1924 
   1925 	/*
   1926 	 * Set the 'next_vpa' pointer for the old stopper to be the
   1927 	 * physical address of the new stopper. The RISC can only
   1928 	 * follow physical addresses.
   1929 	 */
   1930 	sc->icq_sp->next_vpa = new_carrp->carr_pa;
   1931 
   1932 	/*
   1933 	 * Set the host adapter stopper pointer to point to the new carrier.
   1934 	 */
   1935 	sc->icq_sp = new_carrp;
   1936 
   1937 /*	ccb_carr = ccb->carr_list;
   1938 	while(ccb_carr != ASC_CQ_STOPPER) {
   1939 		bus_dmamap_load(sc->sc_dmat, ccb_carr->dmamap_xfer,
   1940 				ccb_carr, ADW_CARRIER_SIZE,
   1941 				NULL, BUS_DMA_NOWAIT);
   1942 		bus_dmamap_sync(sc->sc_dmat, ccb_carr->dmamap_xfer, 0,
   1943 				ccb_carr->dmamap_xfer->dm_mapsize,
   1944 				BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1945 		ccb_carr = adw_carrier_phys_kv(sc,
   1946 				ASC_GET_CARRP(ccb_carr->next_vpa));
   1947 	}
   1948 
   1949 	ccb_carr = sc->irq_sp;
   1950 	for(i=0; i<2 && ccb_carr != ASC_CQ_STOPPER; i++) {
   1951 		bus_dmamap_load(sc->sc_dmat, ccb_carr->dmamap_xfer,
   1952 				ccb_carr, ADW_CARRIER_SIZE,
   1953 				NULL, BUS_DMA_NOWAIT);
   1954 		bus_dmamap_sync(sc->sc_dmat, ccb_carr->dmamap_xfer, 0,
   1955 				ccb_carr->dmamap_xfer->dm_mapsize,
   1956 				BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1957 		ccb_carr = adw_carrier_phys_kv(sc,
   1958 				ASC_GET_CARRP(ccb_carr->next_vpa));
   1959 	}
   1960 */
   1961 	bus_dmamap_load(sc->sc_dmat, sc->sc_control->dmamap_xfer,
   1962 			sc->sc_control->carriers, ADW_CARRIER_SIZE * ADW_MAX_CARRIER,
   1963 			NULL, BUS_DMA_NOWAIT);
   1964 	bus_dmamap_sync(sc->sc_dmat, sc->sc_control->dmamap_xfer, 0,
   1965 			sc->sc_control->dmamap_xfer->dm_mapsize,
   1966 			BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1967 
   1968 	/*
   1969 	 * Tickle the RISC to tell it to read its Command Queue Head pointer.
   1970 	 */
   1971 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_A);
   1972 	if (sc->chip_type == ADV_CHIP_ASC3550)
   1973 	{
   1974 		/*
   1975 		 * Clear the tickle value. In the ASC-3550 the RISC flag
   1976 		 * command 'clr_tickle_a' does not work unless the host
   1977 		 * value is cleared.
   1978 		 */
   1979 		ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_NOP);
   1980 	}
   1981 
   1982 	return ADW_SUCCESS;
   1983 }
   1984 
   1985 
   1986 void
   1987 AdvResetChip(iot, ioh)
   1988 	bus_space_tag_t iot;
   1989 	bus_space_handle_t ioh;
   1990 {
   1991 
   1992 	/*
   1993 	 * Reset Chip.
   1994 	 */
   1995 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
   1996 			ADW_CTRL_REG_CMD_RESET);
   1997 	AdvSleepMilliSecond(100);
   1998 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
   1999 			ADW_CTRL_REG_CMD_WR_IO_REG);
   2000 }
   2001 
   2002 
   2003 /*
   2004  * Reset SCSI Bus and purge all outstanding requests.
   2005  *
   2006  * Return Value:
   2007  *      ADW_TRUE(1) -   All requests are purged and SCSI Bus is reset.
   2008  *      ADW_FALSE(0) -  Microcode command failed.
   2009  *      ADW_ERROR(-1) - Microcode command timed-out. Microcode or IC
   2010  *                      may be hung which requires driver recovery.
   2011  */
   2012 int
   2013 AdvResetCCB(sc)
   2014 ADW_SOFTC	*sc;
   2015 {
   2016 	int	    status;
   2017 
   2018 	/*
   2019 	 * Send the SCSI Bus Reset idle start idle command which asserts
   2020 	 * the SCSI Bus Reset signal.
   2021 	 */
   2022 	status = AdvSendIdleCmd(sc, (u_int16_t) IDLE_CMD_SCSI_RESET_START, 0L);
   2023 	if (status != ADW_TRUE)
   2024 	{
   2025 		return status;
   2026 	}
   2027 
   2028 	/*
   2029 	 * Delay for the specified SCSI Bus Reset hold time.
   2030 	 *
   2031 	 * The hold time delay is done on the host because the RISC has no
   2032 	 * microsecond accurate timer.
   2033 	 */
   2034 	AdvDelayMicroSecond((u_int16_t) ASC_SCSI_RESET_HOLD_TIME_US);
   2035 
   2036 	/*
   2037 	 * Send the SCSI Bus Reset end idle command which de-asserts
   2038 	 * the SCSI Bus Reset signal and purges any pending requests.
   2039 	 */
   2040 	status = AdvSendIdleCmd(sc, (u_int16_t) IDLE_CMD_SCSI_RESET_END, 0L);
   2041 	if (status != ADW_TRUE)
   2042 	{
   2043 		return status;
   2044 	}
   2045 
   2046 	AdvSleepMilliSecond((u_int32_t) sc->scsi_reset_wait * 1000);
   2047 
   2048 	return status;
   2049 }
   2050 
   2051 
   2052 /*
   2053  * Reset chip and SCSI Bus.
   2054  *
   2055  * Return Value:
   2056  *      ADW_TRUE(1) -   Chip re-initialization and SCSI Bus Reset successful.
   2057  *      ADW_FALSE(0) -  Chip re-initialization and SCSI Bus Reset failure.
   2058  */
   2059 int
   2060 AdvResetSCSIBus(sc)
   2061 ADW_SOFTC	*sc;
   2062 {
   2063 	bus_space_tag_t iot = sc->sc_iot;
   2064 	bus_space_handle_t ioh = sc->sc_ioh;
   2065 	int		status;
   2066 	u_int16_t	wdtr_able, sdtr_able, tagqng_able;
   2067 	u_int8_t	tid, max_cmd[ADW_MAX_TID + 1];
   2068 	u_int16_t	bios_sig;
   2069 
   2070 
   2071 	/*
   2072 	 * Save current per TID negotiated values.
   2073 	 */
   2074 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, wdtr_able);
   2075 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sdtr_able);
   2076 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE, tagqng_able);
   2077 	for (tid = 0; tid <= ADW_MAX_TID; tid++)
   2078 	{
   2079 		ADW_READ_BYTE_LRAM(iot, ioh, ASC_MC_NUMBER_OF_MAX_CMD + tid,
   2080 			max_cmd[tid]);
   2081 	}
   2082 
   2083 	/*
   2084 	 * Force the AdvInitAsc3550/38C0800Driver() function to
   2085 	 * perform a SCSI Bus Reset by clearing the BIOS signature word.
   2086 	 * The initialization functions assumes a SCSI Bus Reset is not
   2087 	 * needed if the BIOS signature word is present.
   2088 	 */
   2089 	ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_BIOS_SIGNATURE, bios_sig);
   2090 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_BIOS_SIGNATURE, 0);
   2091 
   2092 	/*
   2093 	 * Stop chip and reset it.
   2094 	 */
   2095 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_RISC_CSR, ADW_RISC_CSR_STOP);
   2096 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
   2097 			ADW_CTRL_REG_CMD_RESET);
   2098 	AdvSleepMilliSecond(100);
   2099 	ADW_WRITE_WORD_REGISTER(iot, ioh, IOPW_CTRL_REG,
   2100 			ADW_CTRL_REG_CMD_WR_IO_REG);
   2101 
   2102 	/*
   2103 	 * Reset Adv Library error code, if any, and try
   2104 	 * re-initializing the chip.
   2105 	 */
   2106 	if (sc->chip_type == ADV_CHIP_ASC38C0800) {
   2107 		status = AdvInitAsc38C0800Driver(sc);
   2108 	} else {
   2109 		status = AdvInitAsc3550Driver(sc);
   2110 	}
   2111 
   2112 	/* Translate initialization return value to status value. */
   2113 	if (status == 0) {
   2114 		status = ADW_TRUE;
   2115 	} else {
   2116 		status = ADW_FALSE;
   2117 	}
   2118 
   2119 	/*
   2120 	 * Restore the BIOS signature word.
   2121 	 */
   2122 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_BIOS_SIGNATURE, bios_sig);
   2123 
   2124 	/*
   2125 	 * Restore per TID negotiated values.
   2126 	 */
   2127 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE, wdtr_able);
   2128 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, sdtr_able);
   2129 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE, tagqng_able);
   2130 	for (tid = 0; tid <= ADW_MAX_TID; tid++) {
   2131 		ADW_WRITE_BYTE_LRAM(iot, ioh, ASC_MC_NUMBER_OF_MAX_CMD + tid,
   2132 			max_cmd[tid]);
   2133 	}
   2134 
   2135 	return status;
   2136 }
   2137 
   2138 
   2139 /*
   2140  * Adv Library Interrupt Service Routine
   2141  *
   2142  *  This function is called by a driver's interrupt service routine.
   2143  *  The function disables and re-enables interrupts.
   2144  *
   2145  *  When a microcode idle command is completed, the ADV_DVC_VAR
   2146  *  'idle_cmd_done' field is set to ADW_TRUE.
   2147  *
   2148  *  Note: AdvISR() can be called when interrupts are disabled or even
   2149  *  when there is no hardware interrupt condition present. It will
   2150  *  always check for completed idle commands and microcode requests.
   2151  *  This is an important feature that shouldn't be changed because it
   2152  *  allows commands to be completed from polling mode loops.
   2153  *
   2154  * Return:
   2155  *   ADW_TRUE(1) - interrupt was pending
   2156  *   ADW_FALSE(0) - no interrupt was pending
   2157  */
   2158 int
   2159 AdvISR(sc)
   2160 ADW_SOFTC	*sc;
   2161 {
   2162 	bus_space_tag_t iot = sc->sc_iot;
   2163 	bus_space_handle_t ioh = sc->sc_ioh;
   2164 	u_int8_t	int_stat;
   2165 	u_int16_t	target_bit;
   2166 	ADW_CARRIER	*free_carrp/*, *ccb_carr*/;
   2167 	u_int32_t	irq_next_pa;
   2168 	ADW_SCSI_REQ_Q	*scsiq;
   2169 	ADW_CCB		*ccb;
   2170 //	int		i;
   2171 
   2172 
   2173 	/* Reading the register clears the interrupt. */
   2174 	int_stat = ADW_READ_BYTE_REGISTER(iot, ioh, IOPB_INTR_STATUS_REG);
   2175 
   2176 	if ((int_stat & (ADW_INTR_STATUS_INTRA | ADW_INTR_STATUS_INTRB |
   2177 	     ADW_INTR_STATUS_INTRC)) == 0) {
   2178 		return ADW_FALSE;
   2179 	}
   2180 
   2181 	bus_dmamap_sync(sc->sc_dmat, sc->sc_control->dmamap_xfer, 0,
   2182 		sc->sc_control->dmamap_xfer->dm_mapsize,
   2183 		BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2184 	bus_dmamap_unload(sc->sc_dmat, sc->sc_control->dmamap_xfer);
   2185 
   2186 /*	ccb_carr = sc->irq_sp;
   2187 	for(i=0; i<2 && ccb_carr != ASC_CQ_STOPPER; i++) {
   2188 		bus_dmamap_sync(sc->sc_dmat, ccb_carr->dmamap_xfer, 0,
   2189 			ccb_carr->dmamap_xfer->dm_mapsize,
   2190 			BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2191 		bus_dmamap_unload(sc->sc_dmat, ccb_carr->dmamap_xfer);
   2192 		ccb_carr = adw_carrier_phys_kv(sc,
   2193 			ASC_GET_CARRP(ccb_carr->next_vpa));
   2194 	}
   2195 */
   2196 	/*
   2197 	 * Notify the driver of an asynchronous microcode condition by
   2198 	 * calling the ADV_DVC_VAR.async_callback function. The function
   2199 	 * is passed the microcode ASC_MC_INTRB_CODE byte value.
   2200 	 */
   2201 	if (int_stat & ADW_INTR_STATUS_INTRB) {
   2202 		u_int8_t intrb_code;
   2203 
   2204 		ADW_READ_BYTE_LRAM(iot, ioh, ASC_MC_INTRB_CODE, intrb_code);
   2205 		if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
   2206 		    sc->carr_pending_cnt != 0) {
   2207 		    ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_A);
   2208 		    if (sc->chip_type == ADV_CHIP_ASC3550) {
   2209 		    	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_NOP);
   2210 		    }
   2211 		}
   2212 
   2213 		if (sc->async_callback != 0) {
   2214 		    (*(ADW_ASYNC_CALLBACK)sc->async_callback)(sc, intrb_code);
   2215 		}
   2216 	}
   2217 
   2218 	/*
   2219 	 * Check if the IRQ stopper carrier contains a completed request.
   2220 	 */
   2221 	while (((irq_next_pa = sc->irq_sp->next_vpa) & ASC_RQ_DONE) != 0)
   2222 	{
   2223 		/*
   2224 		 * Get a pointer to the newly completed ADW_SCSI_REQ_Q structure.
   2225 		 * The RISC will have set 'areq_vpa' to a virtual address.
   2226 		 *
   2227 		 * The firmware will have copied the ASC_SCSI_REQ_Q.ccb_ptr
   2228 		 * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
   2229 		 * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
   2230 		 * in AdvExeScsiQueue().
   2231 		 */
   2232 		ccb = adw_ccb_phys_kv(sc, sc->irq_sp->areq_vpa);
   2233 		scsiq = &ccb->scsiq;
   2234 		scsiq->ccb_ptr = sc->irq_sp->areq_vpa;
   2235 
   2236 /*		ccb_carr = ccb->carr_list;
   2237 		while(ccb_carr != ASC_CQ_STOPPER) {
   2238 			bus_dmamap_sync(sc->sc_dmat, ccb_carr->dmamap_xfer, 0,
   2239 				ccb_carr->dmamap_xfer->dm_mapsize,
   2240 				BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2241 			bus_dmamap_unload(sc->sc_dmat, ccb_carr->dmamap_xfer);
   2242 			ccb_carr = adw_carrier_phys_kv(sc,
   2243 				ASC_GET_CARRP(ccb_carr->next_vpa));
   2244 		}
   2245 
   2246 		bus_dmamap_sync(sc->sc_dmat, sc->irq_sp->dmamap_xfer, 0,
   2247 			sc->irq_sp->dmamap_xfer->dm_mapsize,
   2248 			BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2249 		bus_dmamap_unload(sc->sc_dmat, sc->irq_sp->dmamap_xfer);
   2250 */
   2251 		/*
   2252 		 * Advance the stopper pointer to the next carrier
   2253 		 * ignoring the lower four bits. Free the previous
   2254 		 * stopper carrier.
   2255 		 */
   2256 		free_carrp = sc->irq_sp;
   2257 		sc->irq_sp = adw_carrier_phys_kv(sc, ASC_GET_CARRP(irq_next_pa));
   2258 
   2259 		free_carrp->next_vpa = sc->carr_freelist->carr_pa;
   2260 		sc->carr_freelist = free_carrp;
   2261 		sc->carr_pending_cnt--;
   2262 
   2263 
   2264 		target_bit = ADW_TID_TO_TIDMASK(scsiq->target_id);
   2265 
   2266 		/*
   2267 		 * Clear request microcode control flag.
   2268 		 */
   2269 		scsiq->cntl = 0;
   2270 
   2271 		/*
   2272 		 * Check Condition handling
   2273 		 */
   2274 		/*
   2275 		 * If the command that completed was a SCSI INQUIRY and
   2276 		 * LUN 0 was sent the command, then process the INQUIRY
   2277 		 * command information for the device.
   2278 		 */
   2279 		if (scsiq->done_status == QD_NO_ERROR &&
   2280 		    	 scsiq->cdb[0] == INQUIRY &&
   2281 		    	 scsiq->target_lun == 0) {
   2282 			AdvInquiryHandling(sc, scsiq);
   2283 		}
   2284 
   2285 		/*
   2286 		 * Notify the driver of the completed request by passing
   2287 		 * the ADW_SCSI_REQ_Q pointer to its callback function.
   2288 		 */
   2289 		(*(ADW_ISR_CALLBACK)sc->isr_callback)(sc, scsiq);
   2290 		/*
   2291 		 * Note: After the driver callback function is called, 'scsiq'
   2292 		 * can no longer be referenced.
   2293 		 *
   2294 		 * Fall through and continue processing other completed
   2295 		 * requests...
   2296 		 */
   2297 	}
   2298 
   2299 	return ADW_TRUE;
   2300 }
   2301 
   2302 
   2303 /*
   2304  * Send an idle command to the chip and wait for completion.
   2305  *
   2306  * Command completion is polled for once per microsecond.
   2307  *
   2308  * The function can be called from anywhere including an interrupt handler.
   2309  * But the function is not re-entrant, so it uses the DvcEnter/LeaveCritical()
   2310  * functions to prevent reentrancy.
   2311  *
   2312  * Return Values:
   2313  *   ADW_TRUE - command completed successfully
   2314  *   ADW_FALSE - command failed
   2315  *   ADW_ERROR - command timed out
   2316  */
   2317 int
   2318 AdvSendIdleCmd(sc, idle_cmd, idle_cmd_parameter)
   2319 ADW_SOFTC      *sc;
   2320 u_int16_t       idle_cmd;
   2321 u_int32_t       idle_cmd_parameter;
   2322 {
   2323 	bus_space_tag_t iot = sc->sc_iot;
   2324 	bus_space_handle_t ioh = sc->sc_ioh;
   2325 	int		result;
   2326 	u_int32_t	i, j;
   2327 
   2328 
   2329 	/*
   2330 	 * Clear the idle command status which is set by the microcode
   2331 	 * to a non-zero value to indicate when the command is completed.
   2332 	 * The non-zero result is one of the IDLE_CMD_STATUS_* values
   2333 	 * defined in a_advlib.h.
   2334 	 */
   2335 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_IDLE_CMD_STATUS, (u_int16_t) 0);
   2336 
   2337 	/*
   2338 	 * Write the idle command value after the idle command parameter
   2339 	 * has been written to avoid a race condition. If the order is not
   2340 	 * followed, the microcode may process the idle command before the
   2341 	 * parameters have been written to LRAM.
   2342 	 */
   2343 	ADW_WRITE_DWORD_LRAM(iot, ioh, ASC_MC_IDLE_CMD_PARAMETER,
   2344 	    idle_cmd_parameter);
   2345 	ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_IDLE_CMD, idle_cmd);
   2346 
   2347 	/*
   2348 	 * Tickle the RISC to tell it to process the idle command.
   2349 	 */
   2350 	ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_B);
   2351 	if (sc->chip_type == ADV_CHIP_ASC3550) {
   2352 		/*
   2353 		 * Clear the tickle value. In the ASC-3550 the RISC flag
   2354 		 * command 'clr_tickle_b' does not work unless the host
   2355 		 * value is cleared.
   2356 		 */
   2357 		ADW_WRITE_BYTE_REGISTER(iot, ioh, IOPB_TICKLE, ADV_TICKLE_NOP);
   2358 	}
   2359 
   2360 	/* Wait for up to 100 millisecond for the idle command to timeout. */
   2361 	for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
   2362 		/* Poll once each microsecond for command completion. */
   2363 		for (j = 0; j < SCSI_US_PER_MSEC; j++) {
   2364 			ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_IDLE_CMD_STATUS, result);
   2365 			if (result != 0) {
   2366 				return result;
   2367 			}
   2368 			AdvDelayMicroSecond(1);
   2369 		}
   2370 	}
   2371 
   2372 	return ADW_ERROR;
   2373 }
   2374 
   2375 
   2376 /*
   2377  * Inquiry Information Byte 7 Handling
   2378  *
   2379  * Handle SCSI Inquiry Command information for a device by setting
   2380  * microcode operating variables that affect WDTR, SDTR, and Tag
   2381  * Queuing.
   2382  */
   2383 static void
   2384 AdvInquiryHandling(sc, scsiq)
   2385 ADW_SOFTC	*sc;
   2386 ADW_SCSI_REQ_Q *scsiq;
   2387 {
   2388 #ifndef FAILSAFE
   2389 	bus_space_tag_t iot = sc->sc_iot;
   2390 	bus_space_handle_t ioh = sc->sc_ioh;
   2391 	u_int8_t		tid;
   2392 	ADW_SCSI_INQUIRY	*inq;
   2393 	u_int16_t		tidmask;
   2394 	u_int16_t		cfg_word;
   2395 
   2396 
   2397 	/*
   2398 	 * AdvInquiryHandling() requires up to INQUIRY information Byte 7
   2399 	 * to be available.
   2400 	 *
   2401 	 * If less than 8 bytes of INQUIRY information were requested or less
   2402 	 * than 8 bytes were transferred, then return. cdb[4] is the request
   2403 	 * length and the ADW_SCSI_REQ_Q 'data_cnt' field is set by the
   2404 	 * microcode to the transfer residual count.
   2405 	 */
   2406 
   2407 	if (scsiq->cdb[4] < 8 || (scsiq->cdb[4] - scsiq->data_cnt) < 8) {
   2408 		return;
   2409 	}
   2410 
   2411 	tid = scsiq->target_id;
   2412 
   2413 	inq = (ADW_SCSI_INQUIRY *) scsiq->vdata_addr;
   2414 
   2415 	/*
   2416 	 * WDTR, SDTR, and Tag Queuing cannot be enabled for old devices.
   2417 	 */
   2418 	if (inq->rsp_data_fmt < 2 && inq->ansi_apr_ver < 2) {
   2419 		return;
   2420 	} else {
   2421 		/*
   2422 		 * INQUIRY Byte 7 Handling
   2423 		 *
   2424 		 * Use a device's INQUIRY byte 7 to determine whether it
   2425 		 * supports WDTR, SDTR, and Tag Queuing. If the feature
   2426 		 * is enabled in the EEPROM and the device supports the
   2427 		 * feature, then enable it in the microcode.
   2428 		 */
   2429 
   2430 		tidmask = ADW_TID_TO_TIDMASK(tid);
   2431 
   2432 		/*
   2433 		 * Wide Transfers
   2434 		 *
   2435 		 * If the EEPROM enabled WDTR for the device and the device
   2436 		 * supports wide bus (16 bit) transfers, then turn on the
   2437 		 * device's 'wdtr_able' bit and write the new value to the
   2438 		 * microcode.
   2439 		 */
   2440 #ifdef SCSI_ADW_WDTR_DISABLE
   2441 	if(!(tidmask & SCSI_ADW_WDTR_DISABLE))
   2442 #endif /* SCSI_ADW_WDTR_DISABLE */
   2443 		if ((sc->wdtr_able & tidmask) && inq->WBus16) {
   2444 			ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE,
   2445 					cfg_word);
   2446 			if ((cfg_word & tidmask) == 0) {
   2447 				cfg_word |= tidmask;
   2448 				ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_ABLE,
   2449 						cfg_word);
   2450 
   2451 				/*
   2452 				 * Clear the microcode "SDTR negotiation" and "WDTR
   2453 				 * negotiation" done indicators for the target to cause
   2454 				 * it to negotiate with the new setting set above.
   2455 				 * WDTR when accepted causes the target to enter
   2456 				 * asynchronous mode, so SDTR must be negotiated.
   2457 				 */
   2458 				ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_DONE,
   2459 						cfg_word);
   2460 				cfg_word &= ~tidmask;
   2461 				ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_DONE,
   2462 						cfg_word);
   2463 				ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_WDTR_DONE,
   2464 						cfg_word);
   2465 				cfg_word &= ~tidmask;
   2466 				ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_WDTR_DONE,
   2467 						cfg_word);
   2468 			}
   2469 		}
   2470 
   2471 		/*
   2472 		 * Synchronous Transfers
   2473 		 *
   2474 		 * If the EEPROM enabled SDTR for the device and the device
   2475 		 * supports synchronous transfers, then turn on the device's
   2476 		 * 'sdtr_able' bit. Write the new value to the microcode.
   2477 		 */
   2478 #ifdef SCSI_ADW_SDTR_DISABLE
   2479 	if(!(tidmask & SCSI_ADW_SDTR_DISABLE))
   2480 #endif /* SCSI_ADW_SDTR_DISABLE */
   2481 		if ((sc->sdtr_able & tidmask) && inq->Sync) {
   2482 			ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE, cfg_word);
   2483 			if ((cfg_word & tidmask) == 0) {
   2484 				cfg_word |= tidmask;
   2485 				ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_ABLE,
   2486 						cfg_word);
   2487 
   2488 				/*
   2489 				 * Clear the microcode "SDTR negotiation" done indicator
   2490 				 * for the target to cause it to negotiate with the new
   2491 				 * setting set above.
   2492 				 */
   2493 				ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_SDTR_DONE,
   2494 						cfg_word);
   2495 				cfg_word &= ~tidmask;
   2496 				ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_SDTR_DONE,
   2497 						cfg_word);
   2498 			}
   2499 		}
   2500 
   2501 		/*
   2502 		 * If the EEPROM enabled Tag Queuing for the device and the
   2503 		 * device supports Tag Queueing, then turn on the device's
   2504 		 * 'tagqng_enable' bit in the microcode and set the microcode
   2505 		 * maximum command count to the ADV_DVC_VAR 'max_dvc_qng'
   2506 		 * value.
   2507 		 *
   2508 		 * Tag Queuing is disabled for the BIOS which runs in polled
   2509 		 * mode and would see no benefit from Tag Queuing. Also by
   2510 		 * disabling Tag Queuing in the BIOS devices with Tag Queuing
   2511 		 * bugs will at least work with the BIOS.
   2512 		 */
   2513 #ifdef SCSI_ADW_TAGQ_DISABLE
   2514 	if(!(tidmask & SCSI_ADW_TAGQ_DISABLE))
   2515 #endif /* SCSI_ADW_TAGQ_DISABLE */
   2516 		if ((sc->tagqng_able & tidmask) && inq->CmdQue) {
   2517 			ADW_READ_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE,
   2518 					cfg_word);
   2519 			cfg_word |= tidmask;
   2520 			ADW_WRITE_WORD_LRAM(iot, ioh, ASC_MC_TAGQNG_ABLE,
   2521 					cfg_word);
   2522 
   2523 			ADW_WRITE_BYTE_LRAM(iot, ioh,
   2524 					ASC_MC_NUMBER_OF_MAX_CMD + tid,
   2525 					sc->max_dvc_qng);
   2526 		}
   2527 	}
   2528 #endif /* FAILSAFE */
   2529 }
   2530 
   2531 
   2532 static void
   2533 AdvSleepMilliSecond(n)
   2534 u_int32_t	n;
   2535 {
   2536 
   2537 	DELAY(n * 1000);
   2538 }
   2539 
   2540 
   2541 static void
   2542 AdvDelayMicroSecond(n)
   2543 u_int32_t	n;
   2544 {
   2545 
   2546 	DELAY(n);
   2547 }
   2548 
   2549