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@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