| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * | 
 | 3 |  *			Linux MegaRAID Unified device driver | 
 | 4 |  * | 
 | 5 |  * Copyright (c) 2003-2004  LSI Logic Corporation. | 
 | 6 |  * | 
 | 7 |  *	   This program is free software; you can redistribute it and/or | 
 | 8 |  *	   modify it under the terms of the GNU General Public License | 
 | 9 |  *	   as published by the Free Software Foundation; either version | 
 | 10 |  *	   2 of the License, or (at your option) any later version. | 
 | 11 |  * | 
 | 12 |  * FILE		: mbox_defs.h | 
 | 13 |  * | 
 | 14 |  */ | 
 | 15 | #ifndef _MRAID_MBOX_DEFS_H_ | 
 | 16 | #define _MRAID_MBOX_DEFS_H_ | 
 | 17 |  | 
 | 18 | #include <linux/types.h> | 
 | 19 |  | 
 | 20 | /* | 
 | 21 |  * Commands and states for mailbox based controllers | 
 | 22 |  */ | 
 | 23 |  | 
 | 24 | #define MBOXCMD_LREAD		0x01 | 
 | 25 | #define MBOXCMD_LWRITE		0x02 | 
 | 26 | #define MBOXCMD_PASSTHRU	0x03 | 
 | 27 | #define MBOXCMD_ADPEXTINQ	0x04 | 
 | 28 | #define MBOXCMD_ADAPTERINQ	0x05 | 
 | 29 | #define MBOXCMD_LREAD64		0xA7 | 
 | 30 | #define MBOXCMD_LWRITE64	0xA8 | 
 | 31 | #define MBOXCMD_PASSTHRU64	0xC3 | 
 | 32 | #define MBOXCMD_EXTPTHRU	0xE3 | 
 | 33 |  | 
 | 34 | #define MAIN_MISC_OPCODE	0xA4 | 
 | 35 | #define GET_MAX_SG_SUPPORT	0x01 | 
 | 36 | #define SUPPORT_EXT_CDB		0x16 | 
 | 37 |  | 
 | 38 | #define FC_NEW_CONFIG		0xA1 | 
 | 39 | #define NC_SUBOP_PRODUCT_INFO	0x0E | 
 | 40 | #define NC_SUBOP_ENQUIRY3	0x0F | 
 | 41 | #define ENQ3_GET_SOLICITED_FULL	0x02 | 
 | 42 | #define OP_DCMD_READ_CONFIG	0x04 | 
 | 43 | #define NEW_READ_CONFIG_8LD	0x67 | 
 | 44 | #define READ_CONFIG_8LD		0x07 | 
 | 45 | #define FLUSH_ADAPTER		0x0A | 
 | 46 | #define FLUSH_SYSTEM		0xFE | 
 | 47 |  | 
 | 48 | /* | 
 | 49 |  * Command for random deletion of logical drives | 
 | 50 |  */ | 
 | 51 | #define	FC_DEL_LOGDRV		0xA4 | 
 | 52 | #define	OP_SUP_DEL_LOGDRV	0x2A | 
 | 53 | #define OP_GET_LDID_MAP		0x18 | 
 | 54 | #define OP_DEL_LOGDRV		0x1C | 
 | 55 |  | 
 | 56 | /* | 
 | 57 |  * BIOS commands | 
 | 58 |  */ | 
 | 59 | #define IS_BIOS_ENABLED		0x62 | 
 | 60 | #define GET_BIOS		0x01 | 
 | 61 | #define CHNL_CLASS		0xA9 | 
 | 62 | #define GET_CHNL_CLASS		0x00 | 
 | 63 | #define SET_CHNL_CLASS		0x01 | 
 | 64 | #define CH_RAID			0x01 | 
 | 65 | #define CH_SCSI			0x00 | 
 | 66 | #define BIOS_PVT_DATA		0x40 | 
 | 67 | #define GET_BIOS_PVT_DATA	0x00 | 
 | 68 |  | 
 | 69 |  | 
 | 70 | /* | 
 | 71 |  * Commands to support clustering | 
 | 72 |  */ | 
 | 73 | #define GET_TARGET_ID		0x7D | 
 | 74 | #define CLUSTER_OP		0x70 | 
 | 75 | #define GET_CLUSTER_MODE	0x02 | 
 | 76 | #define CLUSTER_CMD		0x6E | 
 | 77 | #define RESERVE_LD		0x01 | 
 | 78 | #define RELEASE_LD		0x02 | 
 | 79 | #define RESET_RESERVATIONS	0x03 | 
 | 80 | #define RESERVATION_STATUS	0x04 | 
 | 81 | #define RESERVE_PD		0x05 | 
 | 82 | #define RELEASE_PD		0x06 | 
 | 83 |  | 
 | 84 |  | 
 | 85 | /* | 
 | 86 |  * Module battery status | 
 | 87 |  */ | 
 | 88 | #define BATTERY_MODULE_MISSING		0x01 | 
 | 89 | #define BATTERY_LOW_VOLTAGE		0x02 | 
 | 90 | #define BATTERY_TEMP_HIGH		0x04 | 
 | 91 | #define BATTERY_PACK_MISSING		0x08 | 
 | 92 | #define BATTERY_CHARGE_MASK		0x30 | 
 | 93 | #define BATTERY_CHARGE_DONE		0x00 | 
 | 94 | #define BATTERY_CHARGE_INPROG		0x10 | 
 | 95 | #define BATTERY_CHARGE_FAIL		0x20 | 
 | 96 | #define BATTERY_CYCLES_EXCEEDED		0x40 | 
 | 97 |  | 
 | 98 | /* | 
 | 99 |  * Physical drive states. | 
 | 100 |  */ | 
 | 101 | #define PDRV_UNCNF	0 | 
 | 102 | #define PDRV_ONLINE	3 | 
 | 103 | #define PDRV_FAILED	4 | 
 | 104 | #define PDRV_RBLD	5 | 
 | 105 | #define PDRV_HOTSPARE	6 | 
 | 106 |  | 
 | 107 |  | 
 | 108 | /* | 
 | 109 |  * Raid logical drive states. | 
 | 110 |  */ | 
 | 111 | #define RDRV_OFFLINE	0 | 
 | 112 | #define RDRV_DEGRADED	1 | 
 | 113 | #define RDRV_OPTIMAL	2 | 
 | 114 | #define RDRV_DELETED	3 | 
 | 115 |  | 
 | 116 | /* | 
 | 117 |  * Read, write and cache policies | 
 | 118 |  */ | 
 | 119 | #define NO_READ_AHEAD		0 | 
 | 120 | #define READ_AHEAD		1 | 
 | 121 | #define ADAP_READ_AHEAD		2 | 
 | 122 | #define WRMODE_WRITE_THRU	0 | 
 | 123 | #define WRMODE_WRITE_BACK	1 | 
 | 124 | #define CACHED_IO		0 | 
 | 125 | #define DIRECT_IO		1 | 
 | 126 |  | 
 | 127 | #define MAX_LOGICAL_DRIVES_8LD		8 | 
 | 128 | #define MAX_LOGICAL_DRIVES_40LD		40 | 
 | 129 | #define FC_MAX_PHYSICAL_DEVICES		256 | 
 | 130 | #define MAX_MBOX_CHANNELS		5 | 
 | 131 | #define MAX_MBOX_TARGET			15 | 
 | 132 | #define MBOX_MAX_PHYSICAL_DRIVES	MAX_MBOX_CHANNELS*MAX_MBOX_TARGET | 
 | 133 | #define MAX_ROW_SIZE_40LD		32 | 
 | 134 | #define MAX_ROW_SIZE_8LD		8 | 
 | 135 | #define SPAN_DEPTH_8_SPANS		8 | 
 | 136 | #define SPAN_DEPTH_4_SPANS		4 | 
 | 137 | #define MAX_REQ_SENSE_LEN		0x20 | 
 | 138 |  | 
 | 139 |  | 
 | 140 |  | 
 | 141 | /** | 
 | 142 |  * struct mbox_t - Driver and f/w handshake structure. | 
 | 143 |  * @cmd		: firmware command | 
 | 144 |  * @cmdid	: command id | 
 | 145 |  * @numsectors	: number of sectors to be transferred | 
 | 146 |  * @lba		: Logical Block Address on LD | 
 | 147 |  * @xferaddr	: DMA address for data transfer | 
 | 148 |  * @logdrv	: logical drive number | 
 | 149 |  * @numsge	: number of scatter gather elements in sg list | 
 | 150 |  * @resvd	: reserved | 
 | 151 |  * @busy	: f/w busy, must wait to issue more commands. | 
 | 152 |  * @numstatus	: number of commands completed. | 
 | 153 |  * @status	: status of the commands completed | 
 | 154 |  * @completed	: array of completed command ids. | 
 | 155 |  * @poll	: poll and ack sequence | 
 | 156 |  * @ack		: poll and ack sequence | 
 | 157 |  * | 
 | 158 |  * The central handshake structure between the driver and the firmware. This | 
 | 159 |  * structure must be allocated by the driver and aligned at 8-byte boundary. | 
 | 160 |  */ | 
 | 161 | #define MBOX_MAX_FIRMWARE_STATUS	46 | 
 | 162 | typedef struct { | 
 | 163 | 	uint8_t		cmd; | 
 | 164 | 	uint8_t		cmdid; | 
 | 165 | 	uint16_t	numsectors; | 
 | 166 | 	uint32_t	lba; | 
 | 167 | 	uint32_t	xferaddr; | 
 | 168 | 	uint8_t		logdrv; | 
 | 169 | 	uint8_t		numsge; | 
 | 170 | 	uint8_t		resvd; | 
 | 171 | 	uint8_t		busy; | 
 | 172 | 	uint8_t		numstatus; | 
 | 173 | 	uint8_t		status; | 
 | 174 | 	uint8_t		completed[MBOX_MAX_FIRMWARE_STATUS]; | 
 | 175 | 	uint8_t		poll; | 
 | 176 | 	uint8_t		ack; | 
 | 177 | } __attribute__ ((packed)) mbox_t; | 
 | 178 |  | 
 | 179 |  | 
 | 180 | /** | 
 | 181 |  * mbox64_t - 64-bit extension for the mailbox | 
 | 182 |  * @segment_lo	: the low 32-bits of the address of the scatter-gather list | 
 | 183 |  * @segment_hi	: the upper 32-bits of the address of the scatter-gather list | 
 | 184 |  * @mbox	: 32-bit mailbox, whose xferadder field must be set to | 
 | 185 |  *		0xFFFFFFFF | 
 | 186 |  * | 
 | 187 |  * This is the extension of the 32-bit mailbox to be able to perform DMA | 
 | 188 |  * beyond 4GB address range. | 
 | 189 |  */ | 
 | 190 | typedef struct { | 
 | 191 | 	uint32_t	xferaddr_lo; | 
 | 192 | 	uint32_t	xferaddr_hi; | 
 | 193 | 	mbox_t		mbox32; | 
 | 194 | } __attribute__ ((packed)) mbox64_t; | 
 | 195 |  | 
 | 196 | /* | 
 | 197 |  * mailbox structure used for internal commands | 
 | 198 |  */ | 
 | 199 | typedef struct { | 
 | 200 | 	u8	cmd; | 
 | 201 | 	u8	cmdid; | 
 | 202 | 	u8	opcode; | 
 | 203 | 	u8	subopcode; | 
 | 204 | 	u32	lba; | 
 | 205 | 	u32	xferaddr; | 
 | 206 | 	u8	logdrv; | 
 | 207 | 	u8	rsvd[3]; | 
 | 208 | 	u8	numstatus; | 
 | 209 | 	u8	status; | 
 | 210 | } __attribute__ ((packed)) int_mbox_t; | 
 | 211 |  | 
 | 212 | /** | 
 | 213 |  * mraid_passthru_t - passthru structure to issue commands to physical devices | 
 | 214 |  * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr | 
 | 215 |  * @ars			: set if ARS required after check condition | 
 | 216 |  * @islogical		: set if command meant for logical devices | 
 | 217 |  * @logdrv		: logical drive number if command for LD | 
 | 218 |  * @channel		: Channel on which physical device is located | 
 | 219 |  * @target		: SCSI target of the device | 
 | 220 |  * @queuetag		: unused | 
 | 221 |  * @queueaction		: unused | 
 | 222 |  * @cdb			: SCSI CDB | 
 | 223 |  * @cdblen		: length of the CDB | 
 | 224 |  * @reqsenselen		: amount of request sense data to be returned | 
 | 225 |  * @reqsensearea	: Sense information buffer | 
 | 226 |  * @numsge		: number of scatter-gather elements in the sg list | 
 | 227 |  * @scsistatus		: SCSI status of the command completed. | 
 | 228 |  * @dataxferaddr	: DMA data transfer address | 
 | 229 |  * @dataxferlen		: amount of the data to be transferred. | 
 | 230 |  */ | 
 | 231 | typedef struct { | 
 | 232 | 	uint8_t		timeout		:3; | 
 | 233 | 	uint8_t		ars		:1; | 
 | 234 | 	uint8_t		reserved	:3; | 
 | 235 | 	uint8_t		islogical	:1; | 
 | 236 | 	uint8_t		logdrv; | 
 | 237 | 	uint8_t		channel; | 
 | 238 | 	uint8_t		target; | 
 | 239 | 	uint8_t		queuetag; | 
 | 240 | 	uint8_t		queueaction; | 
 | 241 | 	uint8_t		cdb[10]; | 
 | 242 | 	uint8_t		cdblen; | 
 | 243 | 	uint8_t		reqsenselen; | 
 | 244 | 	uint8_t		reqsensearea[MAX_REQ_SENSE_LEN]; | 
 | 245 | 	uint8_t		numsge; | 
 | 246 | 	uint8_t		scsistatus; | 
 | 247 | 	uint32_t	dataxferaddr; | 
 | 248 | 	uint32_t	dataxferlen; | 
 | 249 | } __attribute__ ((packed)) mraid_passthru_t; | 
 | 250 |  | 
 | 251 | typedef struct { | 
 | 252 |  | 
 | 253 | 	uint32_t		dataxferaddr_lo; | 
 | 254 | 	uint32_t		dataxferaddr_hi; | 
 | 255 | 	mraid_passthru_t	pthru32; | 
 | 256 |  | 
 | 257 | } __attribute__ ((packed)) mega_passthru64_t; | 
 | 258 |  | 
 | 259 | /** | 
 | 260 |  * mraid_epassthru_t - passthru structure to issue commands to physical devices | 
 | 261 |  * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr | 
 | 262 |  * @ars			: set if ARS required after check condition | 
 | 263 |  * @rsvd1		: reserved field | 
 | 264 |  * @cd_rom		: (?) | 
 | 265 |  * @rsvd2		: reserved field | 
 | 266 |  * @islogical		: set if command meant for logical devices | 
 | 267 |  * @logdrv		: logical drive number if command for LD | 
 | 268 |  * @channel		: Channel on which physical device is located | 
 | 269 |  * @target		: SCSI target of the device | 
 | 270 |  * @queuetag		: unused | 
 | 271 |  * @queueaction		: unused | 
 | 272 |  * @cdblen		: length of the CDB | 
 | 273 |  * @rsvd3		: reserved field | 
 | 274 |  * @cdb			: SCSI CDB | 
 | 275 |  * @numsge		: number of scatter-gather elements in the sg list | 
 | 276 |  * @status		: SCSI status of the command completed. | 
 | 277 |  * @reqsenselen		: amount of request sense data to be returned | 
 | 278 |  * @reqsensearea	: Sense information buffer | 
 | 279 |  * @rsvd4		: reserved field | 
 | 280 |  * @dataxferaddr	: DMA data transfer address | 
 | 281 |  * @dataxferlen		: amount of the data to be transferred. | 
 | 282 |  */ | 
 | 283 | typedef struct { | 
 | 284 | 	uint8_t		timeout		:3; | 
 | 285 | 	uint8_t		ars		:1; | 
 | 286 | 	uint8_t		rsvd1		:1; | 
 | 287 | 	uint8_t		cd_rom		:1; | 
 | 288 | 	uint8_t		rsvd2		:1; | 
 | 289 | 	uint8_t		islogical	:1; | 
 | 290 | 	uint8_t		logdrv; | 
 | 291 | 	uint8_t		channel; | 
 | 292 | 	uint8_t		target; | 
 | 293 | 	uint8_t		queuetag; | 
 | 294 | 	uint8_t		queueaction; | 
 | 295 | 	uint8_t		cdblen; | 
 | 296 | 	uint8_t		rsvd3; | 
 | 297 | 	uint8_t		cdb[16]; | 
 | 298 | 	uint8_t		numsge; | 
 | 299 | 	uint8_t		status; | 
 | 300 | 	uint8_t		reqsenselen; | 
 | 301 | 	uint8_t		reqsensearea[MAX_REQ_SENSE_LEN]; | 
 | 302 | 	uint8_t		rsvd4; | 
 | 303 | 	uint32_t	dataxferaddr; | 
 | 304 | 	uint32_t	dataxferlen; | 
 | 305 | } __attribute__ ((packed)) mraid_epassthru_t; | 
 | 306 |  | 
 | 307 |  | 
 | 308 | /** | 
 | 309 |  * mraid_pinfo_t - product info, static information about the controller | 
 | 310 |  * @data_size		: current size in bytes (not including resvd) | 
 | 311 |  * @config_signature	: Current value is 0x00282008 | 
 | 312 |  * @fw_version		: Firmware version | 
 | 313 |  * @bios_version	: version of the BIOS | 
 | 314 |  * @product_name	: Name given to the controller | 
 | 315 |  * @max_commands	: Maximum concurrent commands supported | 
 | 316 |  * @nchannels		: Number of SCSI Channels detected | 
 | 317 |  * @fc_loop_present	: Number of Fibre Loops detected | 
 | 318 |  * @mem_type		: EDO, FPM, SDRAM etc | 
 | 319 |  * @signature		: | 
 | 320 |  * @dram_size		: In terms of MB | 
 | 321 |  * @subsysid		: device PCI subsystem ID | 
 | 322 |  * @subsysvid		: device PCI subsystem vendor ID | 
 | 323 |  * @notify_counters	: | 
 | 324 |  * @pad1k		: 135 + 889 resvd = 1024 total size | 
 | 325 |  * | 
 | 326 |  * This structures holds the information about the controller which is not | 
 | 327 |  * expected to change dynamically. | 
 | 328 |  * | 
 | 329 |  * The current value of config signature is 0x00282008: | 
 | 330 |  * 0x28 = MAX_LOGICAL_DRIVES, | 
 | 331 |  * 0x20 = Number of stripes and | 
 | 332 |  * 0x08 = Number of spans | 
 | 333 |  */ | 
 | 334 | typedef struct { | 
 | 335 | 	uint32_t	data_size; | 
 | 336 | 	uint32_t	config_signature; | 
 | 337 | 	uint8_t		fw_version[16]; | 
 | 338 | 	uint8_t		bios_version[16]; | 
 | 339 | 	uint8_t		product_name[80]; | 
 | 340 | 	uint8_t		max_commands; | 
 | 341 | 	uint8_t		nchannels; | 
 | 342 | 	uint8_t		fc_loop_present; | 
 | 343 | 	uint8_t		mem_type; | 
 | 344 | 	uint32_t	signature; | 
 | 345 | 	uint16_t	dram_size; | 
 | 346 | 	uint16_t	subsysid; | 
 | 347 | 	uint16_t	subsysvid; | 
 | 348 | 	uint8_t		notify_counters; | 
 | 349 | 	uint8_t		pad1k[889]; | 
 | 350 | } __attribute__ ((packed)) mraid_pinfo_t; | 
 | 351 |  | 
 | 352 |  | 
 | 353 | /** | 
 | 354 |  * mraid_notify_t - the notification structure | 
 | 355 |  * @global_counter		: Any change increments this counter | 
 | 356 |  * @param_counter		: Indicates any params changed | 
 | 357 |  * @param_id			: Param modified - defined below | 
 | 358 |  * @param_val			: New val of last param modified | 
 | 359 |  * @write_config_counter	: write config occurred | 
 | 360 |  * @write_config_rsvd		: | 
 | 361 |  * @ldrv_op_counter		: Indicates ldrv op started/completed | 
 | 362 |  * @ldrv_opid			: ldrv num | 
 | 363 |  * @ldrv_opcmd			: ldrv operation - defined below | 
 | 364 |  * @ldrv_opstatus		: status of the operation | 
 | 365 |  * @ldrv_state_counter		: Indicates change of ldrv state | 
 | 366 |  * @ldrv_state_id		: ldrv num | 
 | 367 |  * @ldrv_state_new		: New state | 
 | 368 |  * @ldrv_state_old		: old state | 
 | 369 |  * @pdrv_state_counter		: Indicates change of ldrv state | 
 | 370 |  * @pdrv_state_id		: pdrv id | 
 | 371 |  * @pdrv_state_new		: New state | 
 | 372 |  * @pdrv_state_old		: old state | 
 | 373 |  * @pdrv_fmt_counter		: Indicates pdrv format started/over | 
 | 374 |  * @pdrv_fmt_id			: pdrv id | 
 | 375 |  * @pdrv_fmt_val		: format started/over | 
 | 376 |  * @pdrv_fmt_rsvd		: | 
 | 377 |  * @targ_xfer_counter		: Indicates SCSI-2 Xfer rate change | 
 | 378 |  * @targ_xfer_id		: pdrv Id | 
 | 379 |  * @targ_xfer_val		: new Xfer params of last pdrv | 
 | 380 |  * @targ_xfer_rsvd		: | 
 | 381 |  * @fcloop_id_chg_counter	: Indicates loopid changed | 
 | 382 |  * @fcloopid_pdrvid		: pdrv id | 
 | 383 |  * @fcloop_id0			: loopid on fc loop 0 | 
 | 384 |  * @fcloop_id1			: loopid on fc loop 1 | 
 | 385 |  * @fcloop_state_counter	: Indicates loop state changed | 
 | 386 |  * @fcloop_state0		: state of fc loop 0 | 
 | 387 |  * @fcloop_state1		: state of fc loop 1 | 
 | 388 |  * @fcloop_state_rsvd		: | 
 | 389 |  */ | 
 | 390 | typedef struct { | 
 | 391 | 	uint32_t	global_counter; | 
 | 392 | 	uint8_t		param_counter; | 
 | 393 | 	uint8_t		param_id; | 
 | 394 | 	uint16_t	param_val; | 
 | 395 | 	uint8_t		write_config_counter; | 
 | 396 | 	uint8_t		write_config_rsvd[3]; | 
 | 397 | 	uint8_t		ldrv_op_counter; | 
 | 398 | 	uint8_t		ldrv_opid; | 
 | 399 | 	uint8_t		ldrv_opcmd; | 
 | 400 | 	uint8_t		ldrv_opstatus; | 
 | 401 | 	uint8_t		ldrv_state_counter; | 
 | 402 | 	uint8_t		ldrv_state_id; | 
 | 403 | 	uint8_t		ldrv_state_new; | 
 | 404 | 	uint8_t		ldrv_state_old; | 
 | 405 | 	uint8_t		pdrv_state_counter; | 
 | 406 | 	uint8_t		pdrv_state_id; | 
 | 407 | 	uint8_t		pdrv_state_new; | 
 | 408 | 	uint8_t		pdrv_state_old; | 
 | 409 | 	uint8_t		pdrv_fmt_counter; | 
 | 410 | 	uint8_t		pdrv_fmt_id; | 
 | 411 | 	uint8_t		pdrv_fmt_val; | 
 | 412 | 	uint8_t		pdrv_fmt_rsvd; | 
 | 413 | 	uint8_t		targ_xfer_counter; | 
 | 414 | 	uint8_t		targ_xfer_id; | 
 | 415 | 	uint8_t		targ_xfer_val; | 
 | 416 | 	uint8_t		targ_xfer_rsvd; | 
 | 417 | 	uint8_t		fcloop_id_chg_counter; | 
 | 418 | 	uint8_t		fcloopid_pdrvid; | 
 | 419 | 	uint8_t		fcloop_id0; | 
 | 420 | 	uint8_t		fcloop_id1; | 
 | 421 | 	uint8_t		fcloop_state_counter; | 
 | 422 | 	uint8_t		fcloop_state0; | 
 | 423 | 	uint8_t		fcloop_state1; | 
 | 424 | 	uint8_t		fcloop_state_rsvd; | 
 | 425 | } __attribute__ ((packed)) mraid_notify_t; | 
 | 426 |  | 
 | 427 |  | 
 | 428 | /** | 
 | 429 |  * mraid_inquiry3_t - enquiry for device information | 
 | 430 |  * | 
 | 431 |  * @data_size		: current size in bytes (not including resvd) | 
 | 432 |  * @notify		: | 
 | 433 |  * @notify_rsvd		: | 
 | 434 |  * @rebuild_rate	: rebuild rate (0% - 100%) | 
 | 435 |  * @cache_flush_int	: cache flush interval in seconds | 
 | 436 |  * @sense_alert		: | 
 | 437 |  * @drive_insert_count	: drive insertion count | 
 | 438 |  * @battery_status	: | 
 | 439 |  * @num_ldrv		: no. of Log Drives configured | 
 | 440 |  * @recon_state		: state of reconstruct | 
 | 441 |  * @ldrv_op_status	: logdrv Status | 
 | 442 |  * @ldrv_size		: size of each log drv | 
 | 443 |  * @ldrv_prop		: | 
 | 444 |  * @ldrv_state		: state of log drives | 
 | 445 |  * @pdrv_state		: state of phys drvs. | 
 | 446 |  * @pdrv_format		: | 
 | 447 |  * @targ_xfer		: phys device transfer rate | 
 | 448 |  * @pad1k		: 761 + 263reserved = 1024 bytes total size | 
 | 449 |  */ | 
 | 450 | #define MAX_NOTIFY_SIZE		0x80 | 
 | 451 | #define CUR_NOTIFY_SIZE		sizeof(mraid_notify_t) | 
 | 452 |  | 
 | 453 | typedef struct { | 
 | 454 | 	uint32_t	data_size; | 
 | 455 |  | 
 | 456 | 	mraid_notify_t	notify; | 
 | 457 |  | 
 | 458 | 	uint8_t		notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE]; | 
 | 459 |  | 
 | 460 | 	uint8_t		rebuild_rate; | 
 | 461 | 	uint8_t		cache_flush_int; | 
 | 462 | 	uint8_t		sense_alert; | 
 | 463 | 	uint8_t		drive_insert_count; | 
 | 464 |  | 
 | 465 | 	uint8_t		battery_status; | 
 | 466 | 	uint8_t		num_ldrv; | 
 | 467 | 	uint8_t		recon_state[MAX_LOGICAL_DRIVES_40LD / 8]; | 
 | 468 | 	uint16_t	ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8]; | 
 | 469 |  | 
 | 470 | 	uint32_t	ldrv_size[MAX_LOGICAL_DRIVES_40LD]; | 
 | 471 | 	uint8_t		ldrv_prop[MAX_LOGICAL_DRIVES_40LD]; | 
 | 472 | 	uint8_t		ldrv_state[MAX_LOGICAL_DRIVES_40LD]; | 
 | 473 | 	uint8_t		pdrv_state[FC_MAX_PHYSICAL_DEVICES]; | 
 | 474 | 	uint16_t	pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16]; | 
 | 475 |  | 
 | 476 | 	uint8_t		targ_xfer[80]; | 
 | 477 | 	uint8_t		pad1k[263]; | 
 | 478 | } __attribute__ ((packed)) mraid_inquiry3_t; | 
 | 479 |  | 
 | 480 |  | 
 | 481 | /** | 
 | 482 |  * mraid_adapinfo_t - information about the adapter | 
 | 483 |  * @max_commands		: max concurrent commands supported | 
 | 484 |  * @rebuild_rate		: rebuild rate - 0% thru 100% | 
 | 485 |  * @max_targ_per_chan		: max targ per channel | 
 | 486 |  * @nchannels			: number of channels on HBA | 
 | 487 |  * @fw_version			: firmware version | 
 | 488 |  * @age_of_flash		: number of times FW has been flashed | 
 | 489 |  * @chip_set_value		: contents of 0xC0000832 | 
 | 490 |  * @dram_size			: in MB | 
 | 491 |  * @cache_flush_interval	: in seconds | 
 | 492 |  * @bios_version		: | 
 | 493 |  * @board_type			: | 
 | 494 |  * @sense_alert			: | 
 | 495 |  * @write_config_count		: increase with every configuration change | 
 | 496 |  * @drive_inserted_count	: increase with every drive inserted | 
 | 497 |  * @inserted_drive		: channel:Id of inserted drive | 
 | 498 |  * @battery_status		: bit 0: battery module missing | 
 | 499 |  *				bit 1: VBAD | 
| André Goddard Rosa | af901ca | 2009-11-14 13:09:05 -0200 | [diff] [blame] | 500 |  *				bit 2: temperature high | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 501 |  *				bit 3: battery pack missing | 
 | 502 |  *				bit 4,5: | 
 | 503 |  *					00 - charge complete | 
 | 504 |  *					01 - fast charge in progress | 
 | 505 |  *					10 - fast charge fail | 
 | 506 |  *					11 - undefined | 
 | 507 |  *				bit 6: counter > 1000 | 
 | 508 |  *				bit 7: Undefined | 
 | 509 |  * @dec_fault_bus_info		: | 
 | 510 |  */ | 
 | 511 | typedef struct { | 
 | 512 | 	uint8_t		max_commands; | 
 | 513 | 	uint8_t		rebuild_rate; | 
 | 514 | 	uint8_t		max_targ_per_chan; | 
 | 515 | 	uint8_t		nchannels; | 
 | 516 | 	uint8_t		fw_version[4]; | 
 | 517 | 	uint16_t	age_of_flash; | 
 | 518 | 	uint8_t		chip_set_value; | 
 | 519 | 	uint8_t		dram_size; | 
 | 520 | 	uint8_t		cache_flush_interval; | 
 | 521 | 	uint8_t		bios_version[4]; | 
 | 522 | 	uint8_t		board_type; | 
 | 523 | 	uint8_t		sense_alert; | 
 | 524 | 	uint8_t		write_config_count; | 
 | 525 | 	uint8_t		battery_status; | 
 | 526 | 	uint8_t		dec_fault_bus_info; | 
 | 527 | } __attribute__ ((packed)) mraid_adapinfo_t; | 
 | 528 |  | 
 | 529 |  | 
 | 530 | /** | 
 | 531 |  * mraid_ldrv_info_t - information about the logical drives | 
 | 532 |  * @nldrv	: Number of logical drives configured | 
 | 533 |  * @rsvd	: | 
 | 534 |  * @size	: size of each logical drive | 
 | 535 |  * @prop	: | 
 | 536 |  * @state	: state of each logical drive | 
 | 537 |  */ | 
 | 538 | typedef struct { | 
 | 539 | 	uint8_t		nldrv; | 
 | 540 | 	uint8_t		rsvd[3]; | 
 | 541 | 	uint32_t	size[MAX_LOGICAL_DRIVES_8LD]; | 
 | 542 | 	uint8_t		prop[MAX_LOGICAL_DRIVES_8LD]; | 
 | 543 | 	uint8_t		state[MAX_LOGICAL_DRIVES_8LD]; | 
 | 544 | } __attribute__ ((packed)) mraid_ldrv_info_t; | 
 | 545 |  | 
 | 546 |  | 
 | 547 | /** | 
 | 548 |  * mraid_pdrv_info_t - information about the physical drives | 
 | 549 |  * @pdrv_state	: state of each physical drive | 
 | 550 |  */ | 
 | 551 | typedef struct { | 
 | 552 | 	uint8_t		pdrv_state[MBOX_MAX_PHYSICAL_DRIVES]; | 
 | 553 | 	uint8_t		rsvd; | 
 | 554 | } __attribute__ ((packed)) mraid_pdrv_info_t; | 
 | 555 |  | 
 | 556 |  | 
 | 557 | /** | 
 | 558 |  * mraid_inquiry_t - RAID inquiry, mailbox command 0x05 | 
 | 559 |  * @mraid_adapinfo_t	: adapter information | 
 | 560 |  * @mraid_ldrv_info_t	: logical drives information | 
 | 561 |  * @mraid_pdrv_info_t	: physical drives information | 
 | 562 |  */ | 
 | 563 | typedef struct { | 
 | 564 | 	mraid_adapinfo_t	adapter_info; | 
 | 565 | 	mraid_ldrv_info_t	logdrv_info; | 
 | 566 | 	mraid_pdrv_info_t	pdrv_info; | 
 | 567 | } __attribute__ ((packed)) mraid_inquiry_t; | 
 | 568 |  | 
 | 569 |  | 
 | 570 | /** | 
 | 571 |  * mraid_extinq_t - RAID extended inquiry, mailbox command 0x04 | 
 | 572 |  * | 
 | 573 |  * @raid_inq		: raid inquiry | 
 | 574 |  * @phys_drv_format	: | 
 | 575 |  * @stack_attn		: | 
 | 576 |  * @modem_status	: | 
 | 577 |  * @rsvd		: | 
 | 578 |  */ | 
 | 579 | typedef struct { | 
 | 580 | 	mraid_inquiry_t	raid_inq; | 
 | 581 | 	uint16_t	phys_drv_format[MAX_MBOX_CHANNELS]; | 
 | 582 | 	uint8_t		stack_attn; | 
 | 583 | 	uint8_t		modem_status; | 
 | 584 | 	uint8_t		rsvd[2]; | 
 | 585 | } __attribute__ ((packed)) mraid_extinq_t; | 
 | 586 |  | 
 | 587 |  | 
 | 588 | /** | 
 | 589 |  * adap_device_t - device information | 
 | 590 |  * @channel	: channel fpor the device | 
 | 591 |  * @target	: target ID of the device | 
 | 592 |  */ | 
 | 593 | typedef struct { | 
 | 594 | 	uint8_t		channel; | 
 | 595 | 	uint8_t		target; | 
 | 596 | }__attribute__ ((packed)) adap_device_t; | 
 | 597 |  | 
 | 598 |  | 
 | 599 | /** | 
 | 600 |  * adap_span_40ld_t - 40LD span | 
 | 601 |  * @start_blk	: starting block | 
 | 602 |  * @num_blks	: number of blocks | 
 | 603 |  */ | 
 | 604 | typedef struct { | 
 | 605 | 	uint32_t	start_blk; | 
 | 606 | 	uint32_t	num_blks; | 
 | 607 | 	adap_device_t	device[MAX_ROW_SIZE_40LD]; | 
 | 608 | }__attribute__ ((packed)) adap_span_40ld_t; | 
 | 609 |  | 
 | 610 |  | 
 | 611 | /** | 
 | 612 |  * adap_span_8ld_t - 8LD span | 
 | 613 |  * @start_blk	: starting block | 
 | 614 |  * @num_blks	: number of blocks | 
 | 615 |  */ | 
 | 616 | typedef struct { | 
 | 617 | 	uint32_t	start_blk; | 
 | 618 | 	uint32_t	num_blks; | 
 | 619 | 	adap_device_t	device[MAX_ROW_SIZE_8LD]; | 
 | 620 | }__attribute__ ((packed)) adap_span_8ld_t; | 
 | 621 |  | 
 | 622 |  | 
 | 623 | /** | 
 | 624 |  * logdrv_param_t - logical drives parameters | 
 | 625 |  * | 
 | 626 |  * @span_depth	: total number of spans | 
 | 627 |  * @level	: RAID level | 
 | 628 |  * @read_ahead	: read ahead, no read ahead, adaptive read ahead | 
 | 629 |  * @stripe_sz	: encoded stripe size | 
 | 630 |  * @status	: status of the logical drive | 
 | 631 |  * @write_mode	: write mode, write_through/write_back | 
 | 632 |  * @direct_io	: direct io or through cache | 
 | 633 |  * @row_size	: number of stripes in a row | 
 | 634 |  */ | 
 | 635 | typedef struct { | 
 | 636 | 	uint8_t		span_depth; | 
 | 637 | 	uint8_t		level; | 
 | 638 | 	uint8_t		read_ahead; | 
 | 639 | 	uint8_t		stripe_sz; | 
 | 640 | 	uint8_t		status; | 
 | 641 | 	uint8_t		write_mode; | 
 | 642 | 	uint8_t		direct_io; | 
 | 643 | 	uint8_t		row_size; | 
 | 644 | } __attribute__ ((packed)) logdrv_param_t; | 
 | 645 |  | 
 | 646 |  | 
 | 647 | /** | 
 | 648 |  * logdrv_40ld_t - logical drive definition for 40LD controllers | 
 | 649 |  * @lparam	: logical drives parameters | 
 | 650 |  * @span	: span | 
 | 651 |  */ | 
 | 652 | typedef struct { | 
 | 653 | 	logdrv_param_t		lparam; | 
 | 654 | 	adap_span_40ld_t	span[SPAN_DEPTH_8_SPANS]; | 
 | 655 | }__attribute__ ((packed)) logdrv_40ld_t; | 
 | 656 |  | 
 | 657 |  | 
 | 658 | /** | 
 | 659 |  * logdrv_8ld_span8_t - logical drive definition for 8LD controllers | 
 | 660 |  * @lparam	: logical drives parameters | 
 | 661 |  * @span	: span | 
 | 662 |  * | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 663 |  * 8-LD logical drive with up to 8 spans | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 664 |  */ | 
 | 665 | typedef struct { | 
 | 666 | 	logdrv_param_t	lparam; | 
 | 667 | 	adap_span_8ld_t	span[SPAN_DEPTH_8_SPANS]; | 
 | 668 | }__attribute__ ((packed)) logdrv_8ld_span8_t; | 
 | 669 |  | 
 | 670 |  | 
 | 671 | /** | 
 | 672 |  * logdrv_8ld_span4_t - logical drive definition for 8LD controllers | 
 | 673 |  * @lparam	: logical drives parameters | 
 | 674 |  * @span	: span | 
 | 675 |  * | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 676 |  * 8-LD logical drive with up to 4 spans | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 677 |  */ | 
 | 678 | typedef struct { | 
 | 679 | 	logdrv_param_t	lparam; | 
 | 680 | 	adap_span_8ld_t	span[SPAN_DEPTH_4_SPANS]; | 
 | 681 | }__attribute__ ((packed)) logdrv_8ld_span4_t; | 
 | 682 |  | 
 | 683 |  | 
 | 684 | /** | 
 | 685 |  * phys_drive_t - physical device information | 
 | 686 |  * @type	: Type of the device | 
 | 687 |  * @cur_status	: current status of the device | 
 | 688 |  * @tag_depth	: Level of tagging | 
| Thadeu Lima de Souza Cascardo | 4b512d2 | 2009-04-14 23:14:10 -0300 | [diff] [blame] | 689 |  * @sync_neg	: sync negotiation - ENABLE or DISABLE | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 690 |  * @size	: configurable size in terms of 512 byte | 
 | 691 |  */ | 
 | 692 | typedef struct { | 
 | 693 | 	uint8_t		type; | 
 | 694 | 	uint8_t		cur_status; | 
 | 695 | 	uint8_t		tag_depth; | 
 | 696 | 	uint8_t		sync_neg; | 
 | 697 | 	uint32_t	size; | 
 | 698 | }__attribute__ ((packed)) phys_drive_t; | 
 | 699 |  | 
 | 700 |  | 
 | 701 | /** | 
 | 702 |  * disk_array_40ld_t - disk array for 40LD controllers | 
 | 703 |  * @numldrv	: number of logical drives | 
 | 704 |  * @resvd	: | 
 | 705 |  * @ldrv	: logical drives information | 
 | 706 |  * @pdrv	: physical drives information | 
 | 707 |  */ | 
 | 708 | typedef struct { | 
 | 709 | 	uint8_t		numldrv; | 
 | 710 | 	uint8_t		resvd[3]; | 
 | 711 | 	logdrv_40ld_t	ldrv[MAX_LOGICAL_DRIVES_40LD]; | 
 | 712 | 	phys_drive_t	pdrv[MBOX_MAX_PHYSICAL_DRIVES]; | 
 | 713 | }__attribute__ ((packed)) disk_array_40ld_t; | 
 | 714 |  | 
 | 715 |  | 
 | 716 | /** | 
 | 717 |  * disk_array_8ld_span8_t - disk array for 8LD controllers | 
 | 718 |  * @numldrv	: number of logical drives | 
 | 719 |  * @resvd	: | 
 | 720 |  * @ldrv	: logical drives information | 
 | 721 |  * @pdrv	: physical drives information | 
 | 722 |  * | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 723 |  * Disk array for 8LD logical drives with up to 8 spans | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 724 |  */ | 
 | 725 | typedef struct { | 
 | 726 | 	uint8_t			numldrv; | 
 | 727 | 	uint8_t			resvd[3]; | 
 | 728 | 	logdrv_8ld_span8_t	ldrv[MAX_LOGICAL_DRIVES_8LD]; | 
 | 729 | 	phys_drive_t		pdrv[MBOX_MAX_PHYSICAL_DRIVES]; | 
 | 730 | }__attribute__ ((packed)) disk_array_8ld_span8_t; | 
 | 731 |  | 
 | 732 |  | 
 | 733 | /** | 
 | 734 |  * disk_array_8ld_span4_t - disk array for 8LD controllers | 
 | 735 |  * @numldrv	: number of logical drives | 
 | 736 |  * @resvd	: | 
 | 737 |  * @ldrv	: logical drives information | 
 | 738 |  * @pdrv	: physical drives information | 
 | 739 |  * | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 740 |  * Disk array for 8LD logical drives with up to 4 spans | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 741 |  */ | 
 | 742 | typedef struct { | 
 | 743 | 	uint8_t			numldrv; | 
 | 744 | 	uint8_t			resvd[3]; | 
 | 745 | 	logdrv_8ld_span4_t	ldrv[MAX_LOGICAL_DRIVES_8LD]; | 
 | 746 | 	phys_drive_t		pdrv[MBOX_MAX_PHYSICAL_DRIVES]; | 
 | 747 | }__attribute__ ((packed)) disk_array_8ld_span4_t; | 
 | 748 |  | 
 | 749 |  | 
 | 750 | /** | 
| Randy Dunlap | 59f19a9 | 2007-01-09 21:40:52 -0800 | [diff] [blame] | 751 |  * struct private_bios_data - bios private data for boot devices | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 752 |  * @geometry	: bits 0-3 - BIOS geometry, 0x0001 - 1GB, 0x0010 - 2GB, | 
 | 753 |  *		0x1000 - 8GB, Others values are invalid | 
 | 754 |  * @unused	: bits 4-7 are unused | 
 | 755 |  * @boot_drv	: logical drive set as boot drive, 0..7 - for 8LD cards, | 
 | 756 |  * 		0..39 - for 40LD cards | 
 | 757 |  * @cksum	: 0-(sum of first 13 bytes of this structure) | 
 | 758 |  */ | 
 | 759 | struct private_bios_data { | 
 | 760 | 	uint8_t		geometry	:4; | 
 | 761 | 	uint8_t		unused		:4; | 
 | 762 | 	uint8_t		boot_drv; | 
 | 763 | 	uint8_t		rsvd[12]; | 
 | 764 | 	uint16_t	cksum; | 
 | 765 | } __attribute__ ((packed)); | 
 | 766 |  | 
 | 767 |  | 
 | 768 | /** | 
 | 769 |  * mbox_sgl64 - 64-bit scatter list for mailbox based controllers | 
 | 770 |  * @address	: address of the buffer | 
 | 771 |  * @length	: data transfer length | 
 | 772 |  */ | 
 | 773 | typedef struct { | 
 | 774 | 	uint64_t	address; | 
 | 775 | 	uint32_t	length; | 
 | 776 | } __attribute__ ((packed)) mbox_sgl64; | 
 | 777 |  | 
 | 778 | /** | 
 | 779 |  * mbox_sgl32 - 32-bit scatter list for mailbox based controllers | 
 | 780 |  * @address	: address of the buffer | 
 | 781 |  * @length	: data transfer length | 
 | 782 |  */ | 
 | 783 | typedef struct { | 
 | 784 | 	uint32_t	address; | 
 | 785 | 	uint32_t	length; | 
 | 786 | } __attribute__ ((packed)) mbox_sgl32; | 
 | 787 |  | 
 | 788 | #endif		// _MRAID_MBOX_DEFS_H_ | 
 | 789 |  | 
 | 790 | /* vim: set ts=8 sw=8 tw=78: */ |