bhareg.h revision 1.6
1/* $NetBSD: bhareg.h,v 1.6 1997/01/04 16:47:03 jonathan Exp $ */ 2 3/* 4 * Copyright (c) 1994, 1996 Charles M. Hannum. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Charles M. Hannum. 17 * 4. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * Originally written by Julian Elischer (julian@tfs.com) 34 * for TRW Financial Systems for use under the MACH(2.5) operating system. 35 * 36 * TRW Financial Systems, in accordance with their agreement with Carnegie 37 * Mellon University, makes this software available to CMU to distribute 38 * or use in any manner that they see fit as long as this message is kept with 39 * the software. For this reason TFS also grants any other persons or 40 * organisations permission to use or modify this software. 41 * 42 * TFS supplies this software to be publicly redistributed 43 * on the understanding that TFS is not responsible for the correct 44 * functioning of this software in any circumstances. 45 */ 46 47typedef u_int8_t physaddr[4]; 48typedef u_int8_t physlen[4]; 49#define ltophys _lto4l 50#define phystol _4ltol 51 52/* 53 * I/O port offsets 54 */ 55#define BHA_CTRL_PORT 0 /* control (wo) */ 56#define BHA_STAT_PORT 0 /* status (ro) */ 57#define BHA_CMD_PORT 1 /* command (wo) */ 58#define BHA_DATA_PORT 1 /* data (ro) */ 59#define BHA_INTR_PORT 2 /* interrupt status (ro) */ 60#define BHA_EXTGEOM_PORT 3 /* extended geometry (ro) */ 61 62/* 63 * BHA_CTRL bits 64 */ 65#define BHA_CTRL_HRST 0x80 /* Hardware reset */ 66#define BHA_CTRL_SRST 0x40 /* Software reset */ 67#define BHA_CTRL_IRST 0x20 /* Interrupt reset */ 68#define BHA_CTRL_SCRST 0x10 /* SCSI bus reset */ 69 70/* 71 * BHA_STAT bits 72 */ 73#define BHA_STAT_STST 0x80 /* Self test in Progress */ 74#define BHA_STAT_DIAGF 0x40 /* Diagnostic Failure */ 75#define BHA_STAT_INIT 0x20 /* Mbx Init required */ 76#define BHA_STAT_IDLE 0x10 /* Host Adapter Idle */ 77#define BHA_STAT_CDF 0x08 /* cmd/data out port full */ 78#define BHA_STAT_DF 0x04 /* Data in port full */ 79#define BHA_STAT_INVDCMD 0x01 /* Invalid command */ 80 81/* 82 * BHA_CMD opcodes 83 */ 84#define BHA_NOP 0x00 /* No operation */ 85#define BHA_MBX_INIT 0x01 /* Mbx initialization */ 86#define BHA_START_SCSI 0x02 /* start scsi command */ 87#define BHA_INQUIRE_REVISION 0x04 /* Adapter Inquiry */ 88#define BHA_MBO_INTR_EN 0x05 /* Enable MBO available interrupt */ 89#if 0 90#define BHA_SEL_TIMEOUT_SET 0x06 /* set selection time-out */ 91#define BHA_BUS_ON_TIME_SET 0x07 /* set bus-on time */ 92#define BHA_BUS_OFF_TIME_SET 0x08 /* set bus-off time */ 93#define BHA_SPEED_SET 0x09 /* set transfer speed */ 94#endif 95#define BHA_INQUIRE_DEVICES 0x0a /* return installed devices 0-7 */ 96#define BHA_INQUIRE_CONFIG 0x0b /* return configuration data */ 97#define BHA_TARGET_EN 0x0c /* enable target mode */ 98#define BHA_INQUIRE_SETUP 0x0d /* return setup data */ 99#define BHA_ECHO 0x1e /* Echo command data */ 100#define BHA_INQUIRE_DEVICES_2 0x23 /* return installed devices 8-15 */ 101#define BHA_MBX_INIT_EXTENDED 0x81 /* Mbx initialization */ 102#define BHA_INQUIRE_REVISION_3 0x84 /* Get 3rd firmware version byte */ 103#define BHA_INQUIRE_REVISION_4 0x85 /* Get 4th firmware version byte */ 104#define BHA_INQUIRE_MODEL 0x8b /* Get hardware ID and revision */ 105#define BHA_INQUIRE_PERIOD 0x8c /* Get synchronous period */ 106#define BHA_INQUIRE_EXTENDED 0x8d /* Adapter Setup Inquiry */ 107#define BHA_ROUND_ROBIN 0x8f /* Enable/Disable(default) round robin */ 108#define BHA_MODIFY_IOPORT 0x95 /* change or disable I/O port */ 109 110 111/* 112 * BHA_INTR bits 113 */ 114#define BHA_INTR_ANYINTR 0x80 /* Any interrupt */ 115#define BHA_INTR_SCRD 0x08 /* SCSI reset detected */ 116#define BHA_INTR_HACC 0x04 /* Command complete */ 117#define BHA_INTR_MBOA 0x02 /* MBX out empty */ 118#define BHA_INTR_MBIF 0x01 /* MBX in full */ 119 120struct bha_mbx_out { 121 physaddr ccb_addr; 122 u_char dummy[3]; 123 u_char cmd; 124}; 125 126struct bha_mbx_in { 127 physaddr ccb_addr; 128 u_char dummy[3]; 129 u_char stat; 130}; 131 132/* 133 * mbo.cmd values 134 */ 135#define BHA_MBO_FREE 0x0 /* MBO entry is free */ 136#define BHA_MBO_START 0x1 /* MBO activate entry */ 137#define BHA_MBO_ABORT 0x2 /* MBO abort entry */ 138 139/* 140 * mbi.stat values 141 */ 142#define BHA_MBI_FREE 0x0 /* MBI entry is free */ 143#define BHA_MBI_OK 0x1 /* completed without error */ 144#define BHA_MBI_ABORT 0x2 /* aborted ccb */ 145#define BHA_MBI_UNKNOWN 0x3 /* Tried to abort invalid CCB */ 146#define BHA_MBI_ERROR 0x4 /* Completed with error */ 147 148#if defined(BIG_DMA) 149WARNING...THIS WON'T WORK(won't fit on 1 page) 150#if 0 151#define BHA_NSEG 2048 /* Number of scatter gather segments - to much vm */ 152#endif 153#define BHA_NSEG 128 154#else 155#define BHA_NSEG 33 156#endif /* BIG_DMA */ 157 158struct bha_scat_gath { 159 physlen seg_len; 160 physaddr seg_addr; 161}; 162 163struct bha_ccb { 164 u_char opcode; 165 u_char:3, data_in:1, data_out:1,:3; 166 u_char scsi_cmd_length; 167 u_char req_sense_length; 168 /*------------------------------------longword boundary */ 169 physlen data_length; 170 /*------------------------------------longword boundary */ 171 physaddr data_addr; 172 /*------------------------------------longword boundary */ 173 u_char dummy1[2]; 174 u_char host_stat; 175 u_char target_stat; 176 /*------------------------------------longword boundary */ 177 u_char target; 178 u_char lun; 179 struct scsi_generic scsi_cmd; 180 u_char dummy2[1]; 181 u_char link_id; 182 /*------------------------------------longword boundary */ 183 physaddr link_addr; 184 /*------------------------------------longword boundary */ 185 physaddr sense_ptr; 186/*-----end of HW fields-----------------------longword boundary */ 187 struct scsi_sense_data scsi_sense; 188 /*------------------------------------longword boundary */ 189 struct bha_scat_gath scat_gath[BHA_NSEG]; 190 /*------------------------------------longword boundary */ 191 TAILQ_ENTRY(bha_ccb) chain; 192 struct bha_ccb *nexthash; 193 long hashkey; 194 struct scsi_xfer *xs; /* the scsi_xfer for this cmd */ 195 int flags; 196#define CCB_ALLOC 0x01 197#define CCB_ABORT 0x02 198#ifdef BHADIAG 199#define CCB_SENDING 0x04 200#endif 201 int timeout; 202}; 203 204/* 205 * opcode fields 206 */ 207#define BHA_INITIATOR_CCB 0x00 /* SCSI Initiator CCB */ 208#define BHA_TARGET_CCB 0x01 /* SCSI Target CCB */ 209#define BHA_INIT_SCAT_GATH_CCB 0x02 /* SCSI Initiator with scattter gather */ 210#define BHA_RESET_CCB 0x81 /* SCSI Bus reset */ 211 212/* 213 * bha_ccb.host_stat values 214 */ 215#define BHA_OK 0x00 /* cmd ok */ 216#define BHA_LINK_OK 0x0a /* Link cmd ok */ 217#define BHA_LINK_IT 0x0b /* Link cmd ok + int */ 218#define BHA_SEL_TIMEOUT 0x11 /* Selection time out */ 219#define BHA_OVER_UNDER 0x12 /* Data over/under run */ 220#define BHA_BUS_FREE 0x13 /* Bus dropped at unexpected time */ 221#define BHA_INV_BUS 0x14 /* Invalid bus phase/sequence */ 222#define BHA_BAD_MBO 0x15 /* Incorrect MBO cmd */ 223#define BHA_BAD_CCB 0x16 /* Incorrect ccb opcode */ 224#define BHA_BAD_LINK 0x17 /* Not same values of LUN for links */ 225#define BHA_INV_TARGET 0x18 /* Invalid target direction */ 226#define BHA_CCB_DUP 0x19 /* Duplicate CCB received */ 227#define BHA_INV_CCB 0x1a /* Invalid CCB or segment list */ 228 229struct bha_extended_inquire { 230 struct { 231 u_char opcode; 232 u_char len; 233 } cmd; 234 struct { 235 u_char bus_type; /* Type of bus connected to */ 236#define BHA_BUS_TYPE_24BIT 'A' /* ISA bus */ 237#define BHA_BUS_TYPE_32BIT 'E' /* EISA/VLB/PCI bus */ 238#define BHA_BUS_TYPE_MCA 'M' /* MicroChannel bus */ 239 u_char bios_address; /* Address of adapter BIOS */ 240 u_short sg_limit; 241 u_char mbox_count; 242 u_char mbox_baseaddr[4]; /* packed/unaligned uint_32_t */ 243 u_char intrflags; 244#define BHA_INTR_LEVEL 0x40 /* bit 6: level-sensitive interrupt */ 245 u_char firmware_level[3]; /* last 3 digits of firmware rev */ 246 u_char scsi_flags; /* supported SCSI features */ 247#define BHA_SCSI_WIDE 0x01 248#define BHA_SCSI_DIFFERENTIAL 0x02 249#define BHA_SCSI_AUTOCONF 0x04 250#define BHA_SCSI_ULTRA 0x08 251#define BHA_SCSI_TERMINATION 0x10 252 } reply; 253}; 254 255struct bha_config { 256 struct { 257 u_char opcode; 258 } cmd; 259 struct { 260 u_char chan; 261 u_char intr; 262 u_char scsi_dev:3; 263 u_char :5; 264 } reply; 265}; 266 267struct bha_toggle { 268 struct { 269 u_char opcode; 270 u_char enable; 271 } cmd; 272}; 273 274struct bha_mailbox { 275 struct { 276 u_char opcode; 277 u_char nmbx; 278 physaddr addr; 279 } cmd; 280}; 281 282struct bha_model { 283 struct { 284 u_char opcode; 285 u_char len; 286 } cmd; 287 struct { 288 u_char id[4]; /* i.e bt742a -> '7','4','2','A' */ 289 u_char version[2]; /* i.e Board Revision 'H' -> 'H', 0x00 */ 290 } reply; 291}; 292 293struct bha_revision { 294 struct { 295 u_char opcode; 296 } cmd; 297 struct { 298 u_char board_type; 299 u_char custom_feature; 300 char firm_revision; 301 u_char firm_version; 302 } reply; 303}; 304 305struct bha_digit { 306 struct { 307 u_char opcode; 308 } cmd; 309 struct { 310 u_char digit; 311 } reply; 312}; 313 314struct bha_devices { 315 struct { 316 u_char opcode; 317 } cmd; 318 struct { 319 u_char junk[8]; 320 } reply; 321}; 322 323struct bha_sync { 324 u_char offset:4; 325 u_char period:3; 326 u_char valid:1; 327}; 328 329struct bha_setup_reply { 330 u_char sync_neg:1; 331 u_char parity:1; 332 u_char :6; 333 u_char speed; 334 u_char bus_on; 335 u_char bus_off; 336 u_char num_mbx; 337 u_char mbx[3]; /*XXX */ 338 /* doesn't make sense with 32bit addresses */ 339 struct bha_sync sync[8]; 340 u_char disc_sts; 341}; 342 343/* additional reply data supplied by wide controlers */ 344struct bus_setup_reply_wide { 345 u_char pad[5]; /* ??? */ 346 struct bha_sync sync[8]; 347 u_char disc_sts; 348}; 349 350struct bha_setup { 351 struct { 352 u_char opcode; 353 u_char len; 354 } cmd; 355 struct bha_setup_reply reply; 356 struct bus_setup_reply_wide reply_w; /* for wide controllers */ 357}; 358 359struct bha_period_reply { 360 u_char period[8]; 361}; 362 363struct bha_period { 364 struct { 365 u_char opcode; 366 u_char len; 367 } cmd; 368 struct bha_period_reply reply; 369 struct bha_period_reply reply_w; /* for wide controllers */ 370}; 371 372struct bha_isadisable { 373 struct { 374 u_char opcode; 375 u_char modifier; 376 } cmd; 377}; 378 379/* 380 * bha_isadisable.modifier parameters 381 */ 382#define BHA_IOMODIFY_330 0x00 383#define BHA_IOMODIFY_334 0x01 384#define BHA_IOMODIFY_DISABLE1 0x06 385#define BHA_IOMODIFY_DISABLE2 0x07 386 387#define INT9 0x01 388#define INT10 0x02 389#define INT11 0x04 390#define INT12 0x08 391#define INT14 0x20 392#define INT15 0x40 393 394#define EISADMA 0x00 395#define CHAN0 0x01 396#define CHAN5 0x20 397#define CHAN6 0x40 398#define CHAN7 0x80 399