Home | History | Annotate | Line # | Download | only in ic
      1 /*	$NetBSD: mlxreg.h,v 1.8 2008/09/08 23:36:54 gmcgarry Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Andrew Doran.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*-
     33  * Copyright (c) 1999 Michael Smith
     34  * All rights reserved.
     35  *
     36  * Redistribution and use in source and binary forms, with or without
     37  * modification, are permitted provided that the following conditions
     38  * are met:
     39  * 1. Redistributions of source code must retain the above copyright
     40  *    notice, this list of conditions and the following disclaimer.
     41  * 2. Redistributions in binary form must reproduce the above copyright
     42  *    notice, this list of conditions and the following disclaimer in the
     43  *    documentation and/or other materials provided with the distribution.
     44  *
     45  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     46  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     47  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     49  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     50  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     51  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     52  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     53  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     54  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     55  * SUCH DAMAGE.
     56  *
     57  * from FreeBSD: mlxreg.h,v 1.5.2.2 2000/04/24 19:40:50 msmith Exp
     58  */
     59 
     60 #ifndef _IC_MLXREG_H_
     61 #define	_IC_MLXREG_H_
     62 
     63 #define	MLX_SECTOR_SIZE		512
     64 
     65 /*
     66  * Selected command codes.
     67  */
     68 #define	MLX_CMD_ENQUIRY_OLD	0x05
     69 #define	MLX_CMD_ENQUIRY		0x53
     70 #define	MLX_CMD_ENQUIRY2	0x1c
     71 #define	MLX_CMD_ENQSYSDRIVE	0x19
     72 #define	MLX_CMD_READSG		0xb6
     73 #define	MLX_CMD_WRITESG		0xb7
     74 #define	MLX_CMD_READSG_OLD	0x82
     75 #define	MLX_CMD_WRITESG_OLD	0x83
     76 #define	MLX_CMD_FLUSH		0x0a
     77 #define	MLX_CMD_LOGOP		0x72
     78 #define	MLX_CMD_REBUILDASYNC	0x16
     79 #define	MLX_CMD_CHECKASYNC	0x1e
     80 #define	MLX_CMD_REBUILDSTAT	0x0c
     81 #define	MLX_CMD_STOPCHANNEL	0x13
     82 #define	MLX_CMD_STARTCHANNEL	0x12
     83 #define	MLX_CMD_READ_CONFIG	0x4e
     84 #define	MLX_CMD_WRITE_CONFIG	0x4f
     85 #define	MLX_CMD_READ_DK_CONFIG	0x4a
     86 #define	MLX_CMD_WRITE_DK_CONFIG	0x4b
     87 #define	MLX_CMD_DIRECT_CDB	0x04
     88 #define	MLX_CMD_DEVICE_STATE	0x50
     89 #define	MLX_CMD_READ_CONFIG2	0x3d
     90 #define	MLX_CMD_WRITE_CONFIG2	0x3c
     91 
     92 #ifdef _KERNEL
     93 
     94 /*
     95  * Status values.
     96  */
     97 #define	MLX_STATUS_OK		0x0000
     98 #define	MLX_STATUS_RDWROFFLINE	0x0002	/* read/write claims drive is offline */
     99 #define	MLX_STATUS_WEDGED	0xdeaf	/* controller not listening */
    100 #define	MLX_STATUS_LOST		0xdead	/* never came back */
    101 #define	MLX_STATUS_BUSY		0xbabe	/* command is in controller */
    102 
    103 /*
    104  * V1 (EISA) interface.
    105  */
    106 #define	MLX_V1REG_IE			0x09
    107 #define	MLX_V1REG_IDB			0x0d
    108 #define	MLX_V1REG_ODB_EN		0x0e
    109 #define	MLX_V1REG_ODB			0x0f
    110 #define	MLX_V1REG_MAILBOX		0x10
    111 
    112 #define	MLX_V1_IDB_FULL		0x01	/* mailbox is full */
    113 #define	MLX_V1_IDB_INIT_BUSY	0x02	/* init in progress */
    114 
    115 #define	MLX_V1_IDB_SACK		0x02	/* acknowledge status read */
    116 #define	MLX_V1_IDB_RESET	0x10	/* reset controller */
    117 
    118 #define	MLX_V1_ODB_SAVAIL	0x01	/* status is available */
    119 #define	MLX_V1_ODB_RESET	0x02	/* reset controller */
    120 
    121 #define	MLX_V1_FWERROR_PEND	0x04	/* firmware error pending */
    122 
    123 /*
    124  * V2/V3 interface.
    125  */
    126 #define	MLX_V3REG_MAILBOX		0x00
    127 #define	MLX_V3REG_STATUS_IDENT		0x0d
    128 #define	MLX_V3REG_STATUS		0x0e
    129 #define	MLX_V3REG_IDB			0x40
    130 #define	MLX_V3REG_ODB			0x41
    131 #define	MLX_V3REG_IE			0x43
    132 #define	MLX_V3REG_FWERROR		0x3f
    133 #define	MLX_V3REG_FWERROR_PARAM1	0x00
    134 #define	MLX_V3REG_FWERROR_PARAM2	0x01
    135 
    136 #define	MLX_V3_IDB_FULL		0x01	/* mailbox is full */
    137 #define	MLX_V3_IDB_INIT_BUSY	0x02	/* init in progress */
    138 
    139 #define	MLX_V3_IDB_SACK		0x02	/* acknowledge status read */
    140 #define	MLX_V3_IDB_RESET	0x08	/* reset controller */
    141 
    142 #define	MLX_V3_ODB_SAVAIL	0x01	/* status is available */
    143 
    144 #define	MLX_V3_FWERROR_PEND	0x04	/* firmware error pending */
    145 
    146 /*
    147  * V4 interface.
    148  */
    149 #define	MLX_V4REG_MAILBOX		0x1000
    150 #define	MLX_V4REG_STATUS_IDENT		0x1018
    151 #define	MLX_V4REG_STATUS		0x101a
    152 #define	MLX_V4REG_IDB			0x0020
    153 #define	MLX_V4REG_ODB			0x002c
    154 #define	MLX_V4REG_IE			0x0034
    155 #define	MLX_V4REG_FWERROR		0x103f
    156 #define	MLX_V4REG_FWERROR_PARAM1	0x1000
    157 #define	MLX_V4REG_FWERROR_PARAM2	0x1001
    158 
    159 #define	MLX_V4_IDB_FULL		0x01	/* mailbox is full */
    160 #define	MLX_V4_IDB_INIT_BUSY	0x02	/* initialisation in progress */
    161 
    162 #define	MLX_V4_IDB_HWMBOX_CMD	0x01	/* posted hardware mailbox command */
    163 #define	MLX_V4_IDB_SACK		0x02	/* acknowledge status read */
    164 #define	MLX_V4_IDB_MEMMBOX_CMD	0x10	/* posted memory mailbox command */
    165 
    166 #define	MLX_V4_ODB_HWSAVAIL	0x01	/* status available for hardware m/b */
    167 #define	MLX_V4_ODB_MEMSAVAIL	0x02	/* status available for memory m/b */
    168 
    169 #define	MLX_V4_ODB_HWMBOX_ACK	0x01	/* ack status read from hardware m/b */
    170 #define	MLX_V4_ODB_MEMMBOX_ACK	0x02	/* ack status read from memory m/b */
    171 
    172 #define	MLX_V4_IE_MASK		0xfb	/* message unit interrupt mask */
    173 #define	MLX_V4_IE_DISINT	0x04	/* interrupt disable bit */
    174 
    175 #define	MLX_V4_FWERROR_PEND	0x04	/* firmware error pending */
    176 
    177 /*
    178  * V5 interface.
    179  */
    180 #define	MLX_V5REG_MAILBOX		0x50
    181 #define	MLX_V5REG_STATUS_IDENT		0x5d
    182 #define	MLX_V5REG_STATUS		0x5e
    183 #define	MLX_V5REG_IDB			0x60
    184 #define	MLX_V5REG_ODB			0x61
    185 #define	MLX_V5REG_IE			0x34
    186 #define	MLX_V5REG_FWERROR		0x63
    187 #define	MLX_V5REG_FWERROR_PARAM1	0x50
    188 #define	MLX_V5REG_FWERROR_PARAM2	0x51
    189 
    190 #define	MLX_V5_IDB_EMPTY	0x01	/* mailbox is empty */
    191 #define	MLX_V5_IDB_INIT_DONE	0x02	/* initialisation has completed */
    192 
    193 #define	MLX_V5_IDB_HWMBOX_CMD	0x01	/* posted hardware mailbox command */
    194 #define	MLX_V5_IDB_SACK		0x02	/* acknowledge status read */
    195 #define	MLX_V5_IDB_RESET	0x08	/* reset request */
    196 #define	MLX_V5_IDB_MEMMBOX_CMD	0x10	/* posted memory mailbox command */
    197 
    198 #define	MLX_V5_ODB_HWSAVAIL	0x01	/* status available for hardware m/b */
    199 #define	MLX_V5_ODB_MEMSAVAIL	0x02	/* status available for memory m/b */
    200 
    201 #define	MLX_V5_ODB_HWMBOX_ACK	0x01	/* ack status read from hardware m/b */
    202 #define	MLX_V5_ODB_MEMMBOX_ACK	0x02	/* ack status read from memory m/b */
    203 
    204 #define	MLX_V5_IE_DISINT	0x04	/* interrupt disable bit */
    205 
    206 #define	MLX_V5_FWERROR_PEND	0x04	/* firmware error pending */
    207 
    208 #endif /* _KERNEL */
    209 
    210 /*
    211  * Scatter-gather list format, type 1, kind 00.
    212  */
    213 struct mlx_sgentry {
    214 	u_int32_t	sge_addr;
    215 	u_int32_t	sge_count;
    216 } __packed;
    217 
    218 /*
    219  * Command result buffers, as placed in system memory by the controller.
    220  */
    221 struct mlx_enquiry_old {
    222 	u_int8_t	me_num_sys_drvs;
    223 	u_int8_t	me_res1[3];
    224 	u_int32_t	me_drvsize[8];
    225 	u_int16_t	me_flash_age;
    226 	u_int8_t	me_status_flags;
    227 	u_int8_t	me_free_state_change_count;
    228 	u_int8_t	me_fwminor;
    229 	u_int8_t	me_fwmajor;
    230 	u_int8_t	me_rebuild_flag;
    231 	u_int8_t	me_max_commands;
    232 	u_int8_t	me_offline_sd_count;
    233 	u_int8_t	me_res3;
    234 	u_int8_t	me_critical_sd_count;
    235 	u_int8_t	me_res4[3];
    236 	u_int8_t	me_dead_count;
    237 	u_int8_t	me_res5;
    238 	u_int8_t	me_rebuild_count;
    239 	u_int8_t	me_misc_flags;
    240 	struct  {
    241 		u_int8_t	dd_targ;
    242 		u_int8_t	dd_chan;
    243 	} __packed me_dead[20];
    244 } __packed;
    245 
    246 struct mlx_enquiry {
    247 	u_int8_t	me_num_sys_drvs;
    248 	u_int8_t	me_res1[3];
    249 	u_int32_t	me_drvsize[32];
    250 	u_int16_t	me_flash_age;
    251 	u_int8_t	me_status_flags;
    252 #define	MLX_ENQ_SFLAG_DEFWRERR	0x01	/* deferred write error indicator */
    253 #define	MLX_ENQ_SFLAG_BATTLOW	0x02	/* battery low */
    254 	u_int8_t	me_res2;
    255 	u_int8_t	me_fwminor;
    256 	u_int8_t	me_fwmajor;
    257 	u_int8_t	me_rebuild_flag;
    258 	u_int8_t	me_max_commands;
    259 	u_int8_t	me_offline_sd_count;
    260 	u_int8_t	me_res3;
    261 	u_int16_t	me_event_log_seq_num;
    262 	u_int8_t	me_critical_sd_count;
    263 	u_int8_t	me_res4[3];
    264 	u_int8_t	me_dead_count;
    265 	u_int8_t	me_res5;
    266 	u_int8_t	me_rebuild_count;
    267 	u_int8_t	me_misc_flags;
    268 #define	MLX_ENQ_MISC_BBU	0x08	/* battery backup present */
    269 	struct {
    270 		u_int8_t	dd_targ;
    271 		u_int8_t	dd_chan;
    272 	} __packed me_dead[20];
    273 } __packed;
    274 
    275 struct mlx_enquiry2 {
    276 	u_int8_t	me_hardware_id[4];
    277 	u_int8_t	me_firmware_id[4];
    278 	u_int32_t	me_res1;
    279 	u_int8_t	me_configured_channels;
    280 	u_int8_t	me_actual_channels;
    281 	u_int8_t	me_max_targets;
    282 	u_int8_t	me_max_tags;
    283 	u_int8_t	me_max_sys_drives;
    284 	u_int8_t	me_max_arms;
    285 	u_int8_t	me_max_spans;
    286 	u_int8_t	me_res2;
    287 	u_int32_t	me_res3;
    288 	u_int32_t	me_mem_size;
    289 	u_int32_t	me_cache_size;
    290 	u_int32_t	me_flash_size;
    291 	u_int32_t	me_nvram_size;
    292 	u_int16_t	me_mem_type;
    293 	u_int16_t	me_clock_speed;
    294 	u_int16_t	me_mem_speed;
    295 	u_int16_t	me_hardware_speed;
    296 	u_int8_t	me_res4[12];
    297 	u_int16_t	me_max_commands;
    298 	u_int16_t	me_max_sg;
    299 	u_int16_t	me_max_dp;
    300 	u_int16_t	me_max_iod;
    301 	u_int16_t	me_max_comb;
    302 	u_int8_t	me_latency;
    303 	u_int8_t	me_res5;
    304 	u_int8_t	me_scsi_timeout;
    305 	u_int8_t	me_res6;
    306 	u_int16_t	me_min_freelines;
    307 	u_int8_t	me_res7[8];
    308 	u_int8_t	me_rate_const;
    309 	u_int8_t	me_res8[11];
    310 	u_int16_t	me_physblk;
    311 	u_int16_t	me_logblk;
    312 	u_int16_t	me_maxblk;
    313 	u_int16_t	me_blocking_factor;
    314 	u_int16_t	me_cacheline;
    315 	u_int8_t	me_scsi_cap;
    316 	u_int8_t	me_res9[5];
    317 	u_int16_t	me_firmware_build;
    318 	u_int8_t	me_fault_mgmt_type;
    319 	u_int8_t	me_res10;
    320 	u_int32_t	me_firmware_features;
    321 	u_int8_t	me_res11[8];
    322 } __packed;
    323 
    324 /* MLX_CMD_ENQSYSDRIVE returns an array of 32 of these. */
    325 struct mlx_enq_sys_drive {
    326 	u_int32_t	sd_size;
    327 	u_int8_t	sd_state;
    328 	u_int8_t	sd_raidlevel;
    329 	u_int16_t	sd_res1;
    330 } __packed;
    331 
    332 /*
    333  * MLX_CMD_LOGOP/MLX_LOGOP_GET
    334  *
    335  * Bitfields:
    336  *
    337  * 0-4	el_target	SCSI target
    338  * 5-7  el_target	SCSI channel
    339  * 0-6	el_errorcode	error code
    340  * 7-7	el_errorcode	validity (?)
    341  * 0-3	el_sense	sense key
    342  * 4-4	el_sense	reserved
    343  * 5-5	el_sense	ILI
    344  * 6-6	el_sense	EOM
    345  * 7-7	el_sense	filemark
    346  */
    347 struct mlx_eventlog_entry {
    348 	u_int8_t	el_type;
    349 	u_int8_t	el_length;
    350 	u_int8_t	el_target;
    351 	u_int8_t	el_lun;
    352 	u_int16_t	el_seqno;
    353 	u_int8_t	el_errorcode;
    354 	u_int8_t	el_segment;
    355 	u_int8_t	el_sense;
    356 	u_int8_t	el_information[4];
    357 	u_int8_t	el_addsense;
    358 	u_int8_t	el_csi[4];
    359 	u_int8_t	el_asc;
    360 	u_int8_t	el_asq;
    361 	u_int8_t	el_res3[12];
    362 } __packed;
    363 
    364 #define	MLX_LOGOP_GET		0x00	/* operation codes for MLX_CMD_LOGOP */
    365 #define	MLX_LOGMSG_SENSE	0x00	/* log message contents codes */
    366 
    367 struct mlx_rebuild_stat {
    368 	u_int32_t	rb_drive;
    369 	u_int32_t	rb_size;
    370 	u_int32_t	rb_remaining;
    371 } __packed;
    372 
    373 struct mlx_config {
    374 	u_int16_t	cf_flags1;
    375 #define	MLX_CF2_ACTV_NEG	0x0002
    376 #define	MLX_CF2_NORSTRTRY	0x0080
    377 #define	MLX_CF2_STRGWRK		0x0100
    378 #define	MLX_CF2_HPSUPP		0x0200
    379 #define	MLX_CF2_NODISCN		0x0400
    380 #define	MLX_CF2_ARM		0x2000
    381 #define	MLX_CF2_OFM		0x8000
    382 #define	MLX_CF2_AEMI		(MLX_CF2_ARM | MLX_CF2_OFM)
    383 	u_int8_t	cf_oemid;
    384 	u_int8_t	cf_oem_model;
    385 	u_int8_t	cf_physical_sector;
    386 	u_int8_t	cf_logical_sector;
    387 	u_int8_t	cf_blockfactor;
    388 	u_int8_t	cf_flags2;
    389 #define	MLX_CF2_READAH		0x01
    390 #define	MLX_CF2_BIOSDLY		0x02
    391 #define	MLX_CF2_REASS1S		0x10
    392 #define	MLX_CF2_FUAENABL	0x40
    393 #define	MLX_CF2_R5ALLS		0x80
    394 	u_int8_t	cf_rcrate;
    395 	u_int8_t	cf_res1;
    396 	u_int8_t	cf_blocks_per_cache_line;
    397 	u_int8_t	cf_blocks_per_stripe;
    398 	u_int8_t	cf_scsi_param_0;
    399 	u_int8_t	cf_scsi_param_1;
    400 	u_int8_t	cf_scsi_param_2;
    401 	u_int8_t	cf_scsi_param_3;
    402 	u_int8_t	cf_scsi_param_4;
    403 	u_int8_t	cf_scsi_param_5;
    404 	u_int8_t	cf_scsi_initiator_id;
    405 	u_int8_t	cf_res2;
    406 	u_int8_t	cf_startup_mode;
    407 	u_int8_t	cf_simultaneous_spinup_devices;
    408 	u_int8_t	cf_delay_between_spinups;
    409 	u_int8_t	cf_res3;
    410 	u_int16_t	cf_checksum;
    411 } __packed;
    412 
    413 struct mlx_config2 {
    414 	struct mlx_config cf2_cf;
    415 	u_int8_t	cf2_reserved0[26];
    416 	u_int8_t	cf2_flags;
    417 #define	MLX_CF2_BIOS_DIS	0x01
    418 #define	MLX_CF2_CDROM_DIS	0x02
    419 #define	MLX_CF2_GEOM_255	0x20
    420 	u_int8_t	cf2_reserved1[9];
    421 	u_int16_t	cf2_checksum;
    422 } __packed;
    423 
    424 struct mlx_sys_drv_span {
    425 	u_int32_t	sp_start_lba;
    426 	u_int32_t	sp_nblks;
    427 	u_int8_t	sp_arm[8];
    428 } __packed;
    429 
    430 struct mlx_sys_drv {
    431 	u_int8_t	sd_status;
    432 	u_int8_t	sd_ext_status;
    433 	u_int8_t	sd_mod1;
    434 	u_int8_t	sd_mod2;
    435 	u_int8_t	sd_raidlevel;
    436 #define	MLX_SYS_DRV_WRITEBACK	(1<<7)
    437 #define	MLX_SYS_DRV_RAID0	0
    438 #define	MLX_SYS_DRV_RAID1	1
    439 #define	MLX_SYS_DRV_RAID3	3
    440 #define	MLX_SYS_DRV_RAID5	5
    441 #define	MLX_SYS_DRV_RAID6	6
    442 #define	MLX_SYS_DRV_JBOD	7
    443 	u_int8_t	sd_valid_arms;
    444 	u_int8_t	sd_valid_spans;
    445 	u_int8_t	sd_init_state;
    446 #define	MLX_SYS_DRV_INITTED	0x81;
    447 	struct	mlx_sys_drv_span sd_span[4];
    448 } __packed;
    449 
    450 struct mlx_phys_drv {
    451 	u_int8_t	pd_flags1;
    452 #define	MLX_PHYS_DRV_PRESENT	0x01
    453 	u_int8_t	pd_flags2;
    454 #define	MLX_PHYS_DRV_OTHER	0x00
    455 #define	MLX_PHYS_DRV_DISK	0x01
    456 #define	MLX_PHYS_DRV_SEQUENTIAL	0x02
    457 #define	MLX_PHYS_DRV_CDROM	0x03
    458 #define	MLX_PHYS_DRV_FAST20	0x08
    459 #define	MLX_PHYS_DRV_SYNC	0x10
    460 #define	MLX_PHYS_DRV_FAST	0x20
    461 #define	MLX_PHYS_DRV_WIDE	0x40
    462 #define	MLX_PHYS_DRV_TAG	0x80
    463 	u_int8_t	pd_status;
    464 #define	MLX_PHYS_DRV_DEAD	0x00
    465 #define	MLX_PHYS_DRV_WRONLY	0x02
    466 #define	MLX_PHYS_DRV_ONLINE	0x03
    467 #define	MLX_PHYS_DRV_STANDBY	0x10
    468 	u_int8_t	pd_res1;
    469 	u_int8_t	pd_period;
    470 	u_int8_t	pd_offset;
    471 	u_int32_t	pd_config_size;
    472 } __packed;
    473 
    474 struct mlx_core_cfg {
    475 	u_int8_t	cc_num_sys_drives;
    476 	u_int8_t	cc_res1[3];
    477 	struct	mlx_sys_drv cc_sys_drives[32];
    478 	struct	mlx_phys_drv cc_phys_drives[5 * 16];
    479 } __packed;
    480 
    481 /*
    482  * Bitfields:
    483  *
    484  * 0-3	dcdb_target	SCSI target
    485  * 4-7	dcdb_target	SCSI channel
    486  * 0-3	dcdb_length	CDB length
    487  * 4-7	dcdb_length	high 4 bits of `datasize'
    488  */
    489 struct mlx_dcdb {
    490 	u_int8_t	dcdb_target;
    491 	u_int8_t	dcdb_flags;
    492 #define	MLX_DCDB_NO_DATA	0x00
    493 #define	MLX_DCDB_DATA_IN	0x01
    494 #define	MLX_DCDB_DATA_OUT	0x02
    495 #define	MLX_DCDB_EARLY_STATUS	0x04
    496 #define	MLX_DCDB_TIMEOUT_10S	0x10	/* This lot is wrong? [ad] */
    497 #define	MLX_DCDB_TIMEOUT_60S	0x20
    498 #define	MLX_DCDB_TIMEOUT_20M	0x30
    499 #define	MLX_DCDB_TIMEOUT_24H	0x40
    500 #define	MLX_DCDB_NO_AUTO_SENSE	0x40	/* XXX ?? */
    501 #define	MLX_DCDB_DISCONNECT	0x80
    502 	u_int16_t	dcdb_datasize;
    503 	u_int32_t	dcdb_physaddr;
    504 	u_int8_t	dcdb_length;
    505 	u_int8_t	dcdb_sense_length;
    506 	u_int8_t	dcdb_cdb[12];
    507 	u_int8_t	dcdb_sense[64];
    508 	u_int8_t	dcdb_status;
    509 	u_int8_t	res1;
    510 } __packed;
    511 
    512 struct mlx_bbtable_entry {
    513 	u_int32_t	bbt_block_number;
    514 	u_int8_t	bbt_extent;
    515 	u_int8_t	bbt_res1;
    516 	u_int8_t	bbt_entry_type;
    517 	u_int8_t	bbt_system_drive;	/* high 3 bits reserved */
    518 } __packed;
    519 
    520 #endif	/* !_IC_MLXREG_H_ */
    521