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